当前位置: 首页 > news >正文

C语言王国——字符函数和字符串函数(2)

目录

5 strtok函数

5.1 函数的表达式

5.2 函数模拟

6 strstr函数

6.1 函数表达式

7 strerror函数

7.1 函数表达式

7.2 例子

 7.3 perror

8 strncpy、strncat、strncmp函数

四 结论


5 strtok函数

strtok函数我的理解是他是一个分割字符串的函数

5.1 函数的表达式

char* strtok( char* str, const char* sep);

*注意:

  1. sep指向一个字符串,此字符串为分隔符的字符集合。谨记sep是字符串,分隔字符的集合,就是说把分隔字符集中在sep中。
  2. strtok函数会在str字符串中找到下一个sep中的分隔字符,将其变为'\0',并且返回一个指向这个标记的指针。(这是strtok函数第一个参数不为NULL的情况)
  3. 诺第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  4. 如果字符串不存在更多的标记,则返回NULL指针。
  5. 注意strtok函数会改变被操作的字符串,所以此函数分隔的字符串一般都是临时拷贝的内容并且是可以修改的。

5.2 函数模拟

 "Hello world_xxxx"中空格和'_'为分隔符

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "hello world_xxxx";char* sep = " _";char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}


6 strstr函数

此函数是一个函数在另外一个函数中第一次出现的位置。

6.1 函数表达式

char* strstr( const char* str1,const char* str2);

*字符串的比较匹配不包含\0,以\0作为结束标志。


7 strerror函数

此函数就是可以把参数部分错误码对应的信息以字符串地址返回。

7.1 函数表达式

char* strerror( int errnum );

因为这个概念比较官方所以我就用引用大佬的话了:

在不同的系统和C语言标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头文件中说明 的,C语言程序启动的时候就会使用⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会讲对应 的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

什么意思呢?那就让姜糖给各位总结一下吧:

  • 要包含头文件errno.h
  • 此头文件中会用一个变量errno来记录程序错误码
  •  启动时为0表示没有错误,而一旦有错误,errno中的值就会于头文件中的字符串相对应方便我们理解。

7.2 例子

那就来举个例子方便大家理解吧;

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pFile;pFile = fopen("unexist.ent", "r");if (pFile == NULL)printf("Error opening file unexist.ent: %s\n", strerror(errno));return 0;
}

 该指令是让我们以只读模式去打开一个"unexist.ent”文件但是此时我们是没有这个文件的,当此操作错误的时候,错误码对应的值就会赋给errno,然后我们判断pFile是否为NULL,也就是判断程序是否错误,然后我们再用strerror打印该错误。让我们运行一下来看看吧。

 7.3 perror

既然讲到了strerror函数那我在这里提一提另外一个函数吧那就是perror函数,他也是打印错误代码的原因的只不过strerroe是这么表示的:

printf("Error opening file unexist.ent: %s\n", strerror(errno));

而perror是这么表示的 :

perror("Error opening file unxist.ent");

perror的输入结果如下:

 

对比于strerror函数,perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息。


8 strncpy、strncat、strncmp函数

为什么我在这里把这三个函数一起进行介绍呢因为这个函数和我前面介绍的有三个函数用法差不多,接下来就让我先来写一下他们的函数表达式吧:

char* strncpy( char* destination, const char* source, size_t num);
char* strncat( char* destination, const char* source, size_t num);
int strncmp( const char* destination, const char* source, size_t num);

有没有发现他们和前面代码的相似之处?——多了一个num,那么这个num变量有什么用呢?

strncpy函数中:规定原代码的拷贝的个数,诺原来字符串不足num个,则拷贝完后追加0,直到num个。

strncat:将原字符串前num个字符拷贝到目标函数后,诺原字符串不足num个则只追加原字符串中字符的个数。

strncmp中:比较前num个是否相等,其他一样。


四 结论

字符串函数中的使用都要包含头文件string,这里模拟函数只是给大家一种参考不一定完成一样,但利于大家理解,这些库函数也是人写的,他们这些程序员能做到的事情,为什么我们不能做到。那大家就一起跟随姜糖的脚步一步步成为大牛吧。谢谢大家的支持!希望大家发现姜糖的问题及时给姜糖指出来也别忘了一键三连哦。

大家如果对这些函数有兴趣,想知道姜糖是在哪里找的大家可以看看姜糖最初的文章里面推荐了一个网址https://legacy.cplusplus.com/,这个是专门用来查函数和库的。

相关文章:

  • Flutter 中的 ToggleButtonsTheme 小部件:全面指南
  • vue3的Element plus (一)
  • 2024 cicsn Ezheap
  • 使用import语句导入模块
  • c#入门详解:接口详解
  • 12、matlab中for循环,if else判断语句,break和continue用法
  • element中input框添加@keyup.enter.native,按enter后刷新页面
  • allure测试报告用例数和 pytest执行用例数不相同问题
  • 力扣53. 最大子数组和
  • Ubuntu 22.04 .NET8 程序 环境安装和运行
  • AI的制作思维导图
  • 基于Python的农业统计数据可视化系统设计与实现
  • HTML、HTML5一览
  • [线程与网络] 网络编程与通信原理(四):深入理解传输层UDP与TCP协议
  • AR和AP重分类(Regroup)[FAGLF101/OBBU/OBBV]
  • 10个最佳ES6特性 ES7与ES8的特性
  • isset在php5.6-和php7.0+的一些差异
  • Linux快速复制或删除大量小文件
  • MySQL QA
  • PermissionScope Swift4 兼容问题
  • PHP面试之三:MySQL数据库
  • Promise初体验
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Redis中的lru算法实现
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何在GitHub上创建个人博客
  • 数据结构java版之冒泡排序及优化
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 译有关态射的一切
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (70min)字节暑假实习二面(已挂)
  • (k8s中)docker netty OOM问题记录
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (计算机网络)物理层
  • (七)Java对象在Hibernate持久化层的状态
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)Dubbo快速入门、介绍、使用
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理出现中文乱码的情况
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .so文件(linux系统)
  • /*在DataTable中更新、删除数据*/
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @font-face 用字体画图标
  • @JsonSerialize注解的使用