目录
[5 strtok函数](#5 strtok函数)
[5.1 函数的表达式](#5.1 函数的表达式)
[5.2 函数模拟](#5.2 函数模拟)
[6 strstr函数](#6 strstr函数)
[6.1 函数表达式](#6.1 函数表达式)
[7 strerror函数](#7 strerror函数)
[7.1 函数表达式](#7.1 函数表达式)
[7.2 例子](#7.2 例子)
[7.3 perror](#7.3 perror)
[8 strncpy、strncat、strncmp函数](#8 strncpy、strncat、strncmp函数)
[四 结论](#四 结论)
5 strtok函数
strtok函数我的理解是他是一个分割字符串的函数
5.1 函数的表达式
cpp
char* strtok( char* str, const char* sep);
*注意:
- sep指向一个字符串,此字符串为分隔符的字符集合。谨记sep是字符串,分隔字符的集合,就是说把分隔字符集中在sep中。
- strtok函数会在str字符串中找到下一个sep中的分隔字符,将其变为'\0',并且返回一个指向这个标记的指针。(这是strtok函数第一个参数不为NULL的情况)
- 诺第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串不存在更多的标记,则返回NULL指针。
- 注意strtok函数会改变被操作的字符串,所以此函数分隔的字符串一般都是临时拷贝的内容并且是可以修改的。
5.2 函数模拟
"Hello world_xxxx"中空格和'_'为分隔符
cpp
#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 函数表达式
cpp
char* strstr( const char* str1,const char* str2);
*字符串的比较匹配不包含\0,以\0作为结束标志。
7 strerror函数
此函数就是可以把参数部分错误码对应的信息以字符串地址返回。
7.1 函数表达式
cpp
char* strerror( int errnum );
因为这个概念比较官方所以我就用引用大佬的话了:
在不同的系统和C语言标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头文件中说明 的,C语言程序启动的时候就会使用⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会讲对应 的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
什么意思呢?那就让姜糖给各位总结一下吧:
- 要包含头文件errno.h
- 此头文件中会用一个变量errno来记录程序错误码
- 启动时为0表示没有错误,而一旦有错误,errno中的值就会于头文件中的字符串相对应方便我们理解。
7.2 例子
那就来举个例子方便大家理解吧;
cpp
#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是这么表示的:
cpp
printf("Error opening file unexist.ent: %s\n", strerror(errno));
而perror是这么表示的 :
cpp
perror("Error opening file unxist.ent");
perror的输入结果如下:
对比于strerror函数,perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息。
8 strncpy、strncat、strncmp函数
为什么我在这里把这三个函数一起进行介绍呢因为这个函数和我前面介绍的有三个函数用法差不多,接下来就让我先来写一下他们的函数表达式吧:
cpp
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/,这个是专门用来查函数和库的。