目录
- 前言
- 一、strtok 函数的使⽤
- 1.语法和参数
- 2.使用举例
- 3.for循环与strtok的结和
- 二、strerror 函数的使用
- 1.语法和作用
- 2.使用举例
- 总结
前言
这期我们来讲字符函数strtok和strerror函数的使用,话不多说,正文开始。
一、strtok 函数的使⽤
1.语法和参数
char * strtok ( char * str, const char * sep);
• sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
• 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标
记。
• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
• 如果字符串中不存在更多的标记,则返回 NULL 指针。
2.使用举例
上面的讲解可能会不理解这个函数,我们通过下面的例子来讲解一下这个函数:
strtok函数是用来分割字符串的,以第二个参数为分隔符:我们来分割以下字符串:
又因为:strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。)
所以我们一般都是利用strcpy函数将其拷贝一份,再进行分割:
这个字符串的分割符有“@#.”,所以我们有:
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "@#.";return 0;
}
我们开始调用:
第一次分割:
strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。返回起始位置:
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "@#.";char* ret1 = strtok(arr2, sep);return 0;
}
第二次分割:
要想继续分割下面的字符串,我们将第一个参数至于NULL;
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。返回起始位置;
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "@#.";char* ret1 = strtok(arr2, sep);char* ret2 = strtok(NULL, sep);return 0;
}
第三次分割:
要想继续分割下面的字符串,我们将第一个参数至于NULL;
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。返回起始位置;
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "@#.";char* ret1 = strtok(arr2, sep);char* ret2 = strtok(NULL, sep);char* ret3 = strtok(NULL, sep);return 0;
}
最后调用:
没找到分割符,直接返回起始地址:
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "@#.";char* ret1 = strtok(arr2, sep);char* ret2 = strtok(NULL, sep);char* ret3 = strtok(NULL, sep);char* ret4 = strtok(NULL, sep);return 0;
}
我们将其打印:
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "@#.";char* ret1 = strtok(arr2, sep);char* ret2 = strtok(NULL, sep);char* ret3 = strtok(NULL, sep);char* ret4 = strtok(NULL, sep);printf("%s\n", ret1);printf("%s\n", ret2);printf("%s\n", ret3);printf("%s\n", ret4);return 0;
}
运行结果:
我们这里知道我们调用4次就可以打印完目标字符串,但是如果我们调用5次,那最后一次就返回空指针了:
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "#@.";char* ret1 = strtok(arr2, sep);char* ret2 = strtok(NULL, sep);char* ret3 = strtok(NULL, sep);char* ret4 = strtok(NULL, sep);char* ret5 = strtok(NULL, sep);printf("%s\n", ret1);printf("%s\n", ret2);printf("%s\n", ret3);printf("%s\n", ret4);printf("%s\n", ret5);return 0;
}
运行结果:
但是在现实中,我们一般并不知道目标字符串的情况,那怎么知道我们调用多少次:
我们平时一般不会这样调用strtok函数,这里是方便大家理解;
3.for循环与strtok的结和
我们在平时使用一般会和for循环一起使用:
int main()
{char arr1[] = "bit@on#the.road";char arr2[20] = { 0 };strcpy(arr2, arr1);const char* sep = "#@.";char* ret = NULL;for (ret = strtok(arr2, sep); ret != NULL; ret = strtok(NULL, sep)){printf("%s\n", ret);}return 0;
}
运行结果:
二、strerror 函数的使用
1.语法和作用
char * strerror ( int errnum );
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
我们来看看0~10的错误码代表什么错误(VS2022):
int main()
{int i = 0;for (i = 0; i <= 10; i++){printf("%s\n", strerror(i));}return 0;
}
运行结果:
2.使用举例
#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;
}
运行结果:
也可以了解⼀下perror函数,perror函数相当于⼀次将上述代码中的第9⾏完成了,直接将错误信息打
印出来。perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{FILE * pFile;pFile = fopen ("unexist.ent","r");if (pFile == NULL)perror("Error opening file unexist.ent");return 0;
}
运行结果:
总结
这期我们主要讲了strtok和strerror函数的使用,希望大家可以理解,下期见。