📝前言:
上一篇文章C语言——字符函数和字符串函数(二)对字符函数和字符串函数strstr
,strcmp和strncmp
进行了一定的讲解
这篇文章主要讲解以下函数的用法:
1,strtok
2,strerror
3,perror
🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:知不足而奋进,望远山而前行
文章目录
- 一,strtok的使用
- 1,strtok初步了解
- 2,注意事项
- 3,返回值的不同情况
- (1)strtok的参数1不为NULL
- (2)strtok的参数1为NULL
- (3)字符串中不存在更多标记
- 二,strerror的使用
- 三,perror的使用
一,strtok的使用
1,strtok初步了解
我们先来看一下官网对它的介绍👇🏻
提取出它的函数原型:char * strtok ( char * str, const char * delimiters );
①我们先分别理解这里面的参数与返回类型:
●参数1:str
是需要分割的字符串
●参数2:delimiters
是用来分割的分割符的集合
●返回:返回一个指针(下面会讲解具体的返回情况)
②strtok
的功能是:根据delimiters
里面的分隔字符,把 str
分割成不同的标记(这些标记是由分隔符中的任何字符分隔的连续字符序列。)
可能有点抽象,下面我举个例子:
比如我们要分割
“zhangsan@163.com”
这一个字符串
请看下面的代码👇🏻
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "zhangsan@163.com";
char str[3] = { '.','@'};
printf("%s", strtok(arr, str));
return 0;
}
这里面arr
是我们分割的字符串,str
是分隔字符的集合
正常流程就是:用str
中的分隔字符,把arr
分成:zhangsan
,163
,com
这几个标记
但是当我们运行,输出结果👇🏻
(通过这个结果我们可以猜测:printf
应该是从z
这个首地址开始打印,但是打印完zhangsan
就停止了)
是不是这样呢?(当我们了解了strtok
的返回和注意事项就会理解)👇🏻
2,注意事项
strtok
函数在找到str
中的下一个标记的时候,会将标记用‘\0’
结尾(即可能会替换掉这个标记结尾的分隔符)
请看👇🏻
显而易见,当这一次strtok
被调用后,找到了第一个标记zhangsan
,然后把张三后面的@
换成了\0
总之,strtok
函数会改变被操作的字符串,因此在我们使用strtok分割字符串时,可以先把字符串拷贝一份,对拷贝的那一份进行操作,这样就不会造成原来的字符串丢失。
3,返回值的不同情况
在这里返回情况可以分为三类:
1,strtok
的参数1不为NULL
2,strtok
的参数1为NULL
3,字符串中不存在更多标记
(1)strtok的参数1不为NULL
这时候函数会找到str
中的第一个标记,然后以\0
将它结尾,并且记住这个标记结束后的位置,然后返回一个指向这个标记起始位置的指针
继续看上面用到的例子:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "zhangsan@163.com";
char str[3] = { '.','@'};
printf("%s", strtok(arr, str));
return 0;
}
在这个例子里,strtok
函数返回了zhangsan
的起始位置z
,随后printf
从z
位置开始打印,遇到了被strtok
修改成的\0
于是停止了打印
(2)strtok的参数1为NULL
当strtok
的参数为NULL时,函数就会从同一个字符串中被保留的位置(即上一个标记结束后的位置)开始,查找下一个标记,当找到标记后,依然是:以\0
将这个标记结尾,并且记住这个标记结束后的位置,然后返回一个指向这个标记起始位置的指针
请看下面的代码,依旧是要实现分割“zhangsan@163.com”
这一个字符串👇🏻
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "zhangsan@163.com";
char str[3] = { '.','@'};
char* ptr = NULL; //用ptr接收返回的指针
for (ptr = strtok(arr, str); ptr != NULL; ptr = strtok(NULL, str))
{
printf("%s\n", ptr); //用ptr接收的地址打印
}
//用for循环可以实现第一次传入strtok的arr
// 然后传入strtok的都是NULL
return 0;
}
输出结果:
arr
的变化:
第一次strtok
返回z
的地址,且strtok
把@
改成\0
,ptr
接收到了z
的地址
第二次strtok
返回1
的地址,且把.
改成\0
,ptr
接收了1
的地址
第三次strtok
返回c
的地址,且把\0
改成\0
(通俗理解),ptr
接收了c
的地址
然后根据ptr
这些地址分别打印出了这些标记
那第四次,com
之后找不到标记了呢?👇🏻
(3)字符串中不存在更多标记
当字符串中不存在更多标记时,函数就会返回NULL
指针,这也就是为什么上面的例子中for
循环的进入条件是:ptr != NULL
二,strerror的使用
头文件:<errno.h>
strerror
是一个传入错误码作为参数,返回参数部分错误码对应的错误信息的字符串地址的函数
先简单了解什么是错误码:
C语言程序启动的时候,如果程序出现问题,会返回一个错误码,这个错误码会被记录到errno
这个全局变量中
不同的错误码都对应着不同的错误信息
使用展示👇🏻
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE* file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
printf("Error opening file: %s\n", strerror(errno));
return 1; // 返回错误码
}
// ...其他代码...
fclose(file);
return 0; // 返回0表示成功
}
输出结果:
在这个例子中,如果文件打开失败,
fopen
函数会返回NULL
,并且errno
会记录一个表示具体错误的值。
我们使用strerror
函数就可以得到错误码对应的错误信息的地址,然后打印出来。
三,perror的使用
perror
函数也是一个用来打印错误码的函数
通过接受一个字符串作为参数,并把它作为错误消息输出到标准错误流
同样是上面的代码,我们修改一下,用perror
👇🏻
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1; // 返回错误码
}
// ...其他代码...
fclose(file);
return 0; // 返回0表示成功
}
输出结果是完全一样的,perror
的不同就在于,它打印完参数部分的字符串后,在打印一个:
和一个
(空格),接着打印错误信息。
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!