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

244 阅读3分钟

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中,以便返回来打印。

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