目录
前言:
1、strstr
1.1 strstr的使用
4.2 strstr的模拟实现
5、strtok
5.1 strtok函数的介绍
5.2 strtok函数的使用
6、strerror
前言:
这篇文章将介绍strstr函数,strtok函数,strerror函数
1、strstr
1.1 strstr的使用
strstr --- string string
在一个字符串中,找一个字字符串,找第一次出现的位置
我们来尝试使用strstr函数:
char arr1[ ] = "abcdefabcdef ";char arr2[ ] = "def"; char* ret = strstr(arr1, arr2);if (ret == NULL)printf("找不到\n");elseprintf("找到了,%s\n", ret);
这就是strstr函数的作用,通常用来找一个字符串。
4.2 strstr的模拟实现
我们来尝试一下模拟strstr函数(这里小编学的有点模糊,因此可能会有些问题,还望理解,如果后面有时间会来修改)
第一次匹配成功
上面是比较简单的场景,匹配一次便成功了,那如果需要多次匹配呢?
#include <stdio.h>#include <string.h>#include <assert.h>const char* my_strstr(const char* str1, const char* str2)//只寻找,不希望改变,所以使用const修饰{assert(str1 && str2);const char* s1 = str1;const char* s2 = str2;const char* cur = str1;//cur指针记可能的开始匹配的位置if (*str2 == '\0')//当str2是空字符串时,直接返回str1return str1;while (*cur){//完成一次匹配s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return cur;cur++;}return NULL;}int main(){char arr1[ ] = "abcdefabcdef ";char arr2[ ] = "def"; char* ret = my_strstr(arr1, arr2);if (ret == NULL)printf("找不到\n");elseprintf("找到了,%s\n", ret);return 0;}
5、strtok
5.1 strtok函数的介绍
strtok的作用就是通过分隔符切割字符串
char * strtok ( char * str,const char * sep );
sep参数指向一个字符串,定义了用作分隔符的字符集合第一个参数指定一个字符串,它包含了0个或者多个有sep字符串中一个或者多个分隔符分隔的标记strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,直接下一个标记。如果字符串中不存在更多的标记,则返回NULL指针。 先来说明一下strtok的使用场景:
char arr1[ ] = " zhangsan@year.ch"
char arr2[ ] ="www.hawei.com"
char arr3[ ] = " 123.234.345"
我们来一句一句解释上面的介绍
sep参数指向一个字符串,定义了用作分隔符的字符集合
char arr1[ ] = " zhangsan@year.ch"
上面的字符串中的分隔符是哪些呢?
‘@’、‘.‘
我们将这些分隔符放在一起就叫做分隔符的集合
sep中方的就是"@ ."
如果你要切割字符串char arr1[ ] = " zhangsan@year.ch"
你可以写一个数组char str[ ] = "@ ."
第一个参数指定一个字符串,它包含了0个或者多个有sep字符串中一个或者多个分隔符分隔的标记
char arr1[ ] = " zhangsan@year.ch"
这里面的标记有zhangsan,year,ch。
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。
char arr1[ ] = " zhangsan@year.ch"
str开始会先找到zhangsan这个标记,并且把这个标记的结尾改为\0,也就是说会把@改为\0
zhangsan@year.ch
zhangsan\0year.ch
同时会返回指向这个标记的指针
由于strtok会改变被操作的字符串,所以为了防止字符串被修改,一般都会临时拷贝原字符串
从上图中我们可以看到arr1中的@被改为了\0,这样arr1就会被破坏。因此为了防止破坏原数组,我们可以这样使用
int main(){char arr1[] = "zhangsan@year.ch";char sep[] = "@.";char buf[30] = { 0 };strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中char * p = strtok(buf, sep);return 0;}
这样我们可以随意修改buf中的元素而不会对原数组照成影响。
strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,直接下一个标记。
char arr1[ ] = " zhangsan@year.ch"
int main(){char arr1[] = "zhangsan@year.ch";char sep[] = "@.";char buf[30] = { 0 };strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中char * p = strtok(buf, sep);return 0;}
1. 第一个参数不为 NULL 时
当strtok
函数的第一个参数不为NULL
时,它接收一个字符串作为起始处理的对象(假设这个字符串为str
)。函数会根据指定的分隔符(通常在后续调用中指定)在str
中查找第一个分隔符。找到第一个分隔符后,它会将分隔符替换为'\0'
,这样就把原始字符串str
分割成了两部分,函数返回的是分隔符之前的子字符串(第一个标记)。同时,strtok
函数会在内部保存当前处理的位置,这个位置是指刚刚找到的分隔符之后的字符位置,以便后续继续处理字符串的剩余部分 2. 第一个参数为 NULL 时
当strtok
函数的第一个参数为NULL
时,它不会再接收新的字符串,而是基于上一次调用strtok
时保存的位置继续处理同一个字符串。它会从上次保存的位置开始,查找下一个分隔符,同样将分隔符替换为'\0'
,然后返回新的子字符串(下一个标记)。这个过程可以重复,直到字符串中没有更多的分隔符为止。 5.2 strtok函数的使用
int main(){char arr1[] = "zhangsan@year.ch";char sep[] = "@.";char buf[30] = { 0 };strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中char* p = NULL;for (p = strtok(buf, sep); p != NULL; p = strtok(NULL, sep)){printf("%s\n", p);}return 0;}
6、strerror
char * strerror (int errnum);
strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。 在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
errno变量用来记录该程序中的错误代码信息
int main(){int i = 0;for (i = 0; i < 10; i++){printf("%d:%s\n",i, strerror(i));}return 0;}
这里每一个数字对应的都是一个错误码。这里只是为了展示一下错误信息,并不是函数strerror的用法。
关于用法小编目前还没有学到,等到后面再来补充。
结语:本篇文章到这里就结束了,希望能够对大家有所帮助。