字符串函数(4)--strtok函数和strerror函数

本文详细介绍了C语言中的strtok函数用于字符串分割的原理和使用方法,包括如何处理找不到分割符的情况。同时,讨论了strerror函数在报告错误码对应错误信息的应用,特别是在文件操作中的错误处理。通过实例展示了这两个函数的常见用法和注意事项。
摘要由CSDN通过智能技术生成

1.strtok函数 — 分割字符串函数

2.strerror函数 — 错误报告函数

1.strstok函数的用法

char* strtok(char* str, const char* delimiters);

直接看函数的声明:
参数1:要切割的地址,参数2:切割时的标记物

注意:strtok函数本身会记住第一次传过来的这个地址,第一次传过来时:如果这个地址为空,则strtok函数返回一个空指针,如果这个地址不为空,则返回传过来的首地址。

由于这个函数的第二个参数为要切割的标记物,假如这个标记物不存在,返回的也是第一次传进来的要切割的函数的首地址。

下面举例说明:

int main()
{
	char arr[] = "abcd@.dde.agc";
  //192.168.31.121
	//ip地址:点分十进制的表示方式
	char* p = "--";  // 标记物
	char* ret = NULL;
	for (ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p))
	{	//这个函数自己会识别上一次标记的位置
		printf("%s\n",ret);
	}

}

在这里插入图片描述

找不到标记物,返回的是字符串的首地址。
那要是找到了标记物呢?
打印出来的结果是这样的:
在这里插入图片描述
调试后发现:

在这里插入图片描述
第一次切割时,标记物的位置被改成了 ‘\0’
你可能会问,在循环内部,为什么 是 ret = strtok (NULL,p) 呢?传递的不应该是arr吗,
是的,传递的确实不是arr,而是 NULL,为什么呢?

是因为strtok函数内部,在第一次接收到字符串的地址后,当它切割成功时,会自己记住这个切割点的位置,下一次调用这个函数时,它会记住这个位置并且从该位置的下一个位置开始寻找切割物。

这就是为什么第二次及以后调用strtok函数时,传递的第一个参数是NULL的原因。

当我们进行第二次切割时,会发现一个奇怪的问题:
为什么第二次切割没有将第一个@后的 . 改成 ‘\0’ ?,而是在之后的 . 改成 ‘\0’ 呢?
如下图:
在这里插入图片描述

进一步探讨后发现:

在这里插入图片描述

当第一次切割成功后,第二次切割时,我们知道,这个函数会记住上一次切割点并从下一个位置开始寻找切割点,然而,当这所谓的下一个位置,是切割点时,这个函数直接不理,不改成 ‘\0’,直接跳过继续寻找,知道找到的字符不是切割标记字符时,从这以后,才开始真正意义上的找切割点,并更改为 \0

也就是说,第一次切割成功后,abcd@.@@中的第一个@,被改成了 ‘\0’,第二次调用该函数时, .@@不会被改成 ‘\0’,而是直接跳过,继续寻找,知道找到不是切割物的字符。
看到这里,你应该明白了strtok函数的使用方法。

2.strerror函数的使用方法

strerror–错误报告函数,它会返回错误码,所对应的错误信息

  错误码  错误信息
	0		No error
	1		Operation not permitted
	2		No such file or directory

	errno : 是一个全局的错误码的变量
当c语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errmo中

举例:

int main()
{
	FILE* fp = fopen("text.txt", "r");
	if (fp == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
		printf("open file successfully\n");
	}
}

当我们打开文件时,由于电脑中没有这个文件,故会返回错误报告:
在这里插入图片描述
将errno放在strerror中,是为了将该错误码所对应的错误信息放到strerror中,以便返回来打印。

该函数的使用方法就这么简单,一般是配合打开文件等操作使用。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓富民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值