上一篇我们介绍了strlen函数,strcpy函数,strcat函数以及strcmp函数的用法以及模拟实现,本篇接着来介绍剩余的三个字符串函数,分别是strstr函数,strtok函数以及strerror函数。
目录
1.strstr函数
1.了解strstr函数。
const char * strstr ( const char * str1, const char * str2 );
strstr函数的返回类型为char *,所需要的两个参数是不可改变地址内容的char *类型的指针。
2.strstr函数的使用
int main()
{
char arr[] = "abcdefrghfh";
char num[] = "defr";
char aum[] = "bbcd";
printf("%s\n", strstr(arr, num));
printf("%s\n", strstr(arr, aum));
return 0;
}
从上代码我们就能看出,strstr函数实际就是在字符串1中找字符串2,如果存在字符串2,就会返回出现字符串2位置的地址,如果不存在,则会返空指针NULL。
3.strstr函数的模拟实现。
char* my_strstr(const char* arr, const char* num)
{
const char* a = arr;//不改变arr的地址,所以将它存在a中。
const char* s1 = NULL;
const char* s2 = NULL;
if (!*num)//*num如果为空,则为假,加入感叹号改为真。
return (char *)arr;//当num为空时,不需要判断,直接返回arr就可。
while (*arr)
{
s1 = a;
s2 = num;//将s2重新返回num的地址。
while (*s1&&*s2&&(*s1 == *s2))
{
s1++;
s2++;//s1与s2同时向后移。
}
if (*s2 == '\0')
{
return (char *)a;
}
a++;//不满足,则向后移一位,从第二位开始继续判断。
}
return NULL;//都不满足,这说明没有该字符串,返回空指针NULL。
}
int main()
{
char* arr = "abbcdefg";
char* num = "defg";
char *add=my_strstr(arr, num);
printf("%s", add);
return 0;
}
2.strtok函数
1.了解strtok函数
char * strtok ( char * str, const char * delimiters );
•
sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
•
第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标
记。
•
strtok函数找到str中的下⼀个标记,并将其⽤
\0
结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
•
strtok函数的第⼀个参数不为NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
•
strtok函数的第⼀个参数为
NULL
,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
•
如果字符串中不存在更多的标记,则返回
NULL
指针。
2.strtok函数的使用
我们假设有“zhangsan@163.com”这段字符串,我们只想将zhangsan,163,com这三部分单独拿出来,这时候就可以使用strtok函数,而@以及.就叫做分隔符。
int main()
{
char arr[] = "zhangsan@163.com";
char* p = "@.";
printf("%s\n", strtok(arr, p));
printf("%s\n", strtok(NULL, p));
printf("%s\n", strtok(NULL, p));
return 0;
}
分析:
首先我们需要自定义一个常量字符串,其中包含的就是原始字符串的分隔符。
其次需要知道:
strtok函数的第⼀个参数不为NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
我们可以这样理解:
在我们首次传入的是arr首元素的地址,此地址不为空,strtok函数就从首元素向后找,当找到第一个分隔符,就保存这个位置,然后终止;我们第二次传入空指针,则strtok函数就会从上一次标记的位置开始向后找,当找到第二个分隔符时,又会记得第二个分隔符的位置~~以此类推,直到所有分隔符找完时,则返回空指针。
所以上述代码我们可以做这样的修改:
int main()
{
char arr[] = "zhangsan@163.com";
char* p = "@.";
char* s = NULL;
for (s = strtok(arr, p);s != NULL; s = strtok(NULL, p))
{
printf("%s\n", s);
}
return 0;
}
3.strerror函数
1.了解strerror函数
char * strerror ( int errnum );
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在
errno.h
这个头⽂件中说明 的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回.
int main()
{
int i = 0;
for (i = 0; i <= 10; i++) {
printf("%s\n", strerror(i));
}
return 0;
}
2.strerror函数的使用
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");//fopen打开unexist.ent文件
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n", strerror(errno));
return 0;
}
当然,上述代码对于初学者来说不易理解,在我们后续学习中会慢慢学到的。