字符串函数【C语言-3】

❤️订阅专栏:字符串函数

关注博主:翻斗花园第一代码手牛爷爷

目录

  • 前言
  • 函数介绍
    • [strtok函数](https://legacy.cplusplus.com/reference/cstring/strtok/?kw=strtok)
      • strtok函数使用
      • ▶️strtok函数模拟实现
    • [strerror函数](https://legacy.cplusplus.com/reference/cstring/strerror/?kw=strerror)
      • ⛵️strerror函数使用
  • ✈️总结

前言

续上第二篇,我们接下来继续介绍几种字符串函数,想要熟练的运用字符串函数,对函数的一些实现细节的了解是必不可少的。除此之外,跟应该多加练习,敲起来!

函数介绍

strtok函数

char * strtok ( char * str, const char * delimiters );
字符串切割函数

  • delimiters参数是一个字符串,定义了用作分割符的字符集合。
  • 第一个参数指定一个字符串,它包括了0个或者多个由delimiters字符串中一个或者多个分割符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改)
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存他在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL指针。

strtok函数使用

strtok函数和其他字符串函数相比较来说非常特殊,具体的我们用一段代码来分析,如下代码。

#include 
#include 
int main()
{
	char arr[] = "www.baidu@qq123456789";
	char arr2[50] = { 0 };
	strcpy(arr2, arr);
	const char* p = ".@";
	char* ret = NULL;
	ret = strtok(arr2, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);

	return 0;
}

我们arr数组就是一段字符串数组,我们的p则是指向一段分割符的集合。strtok函数对字符串进行切割就是利用分割符对字符串进行切分,并将分割符修改为\0,然后返回标记的地址。所以我们说在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改。我们来观察运行的结果,如下图。
字符串函数【C语言-3】_第1张图片
我们之所以说strtok这个函数特殊,就是因为如果我们要对一段字符串进行切分的话,我们只需要在第一次调用的时候把字符串传给它,在后面的调用就只需要传NULL给它就行了,该函数具有记忆功能,会在后来的调用自动在上一次的调用的后面继续向后进行,在遇到分割符时,会将分割符再次修改为\0,然后返回这一段的标记地址。我们还可以通过监视窗口观察strtok函数将分割符修改的情况以及返回标记地址的情况,如下图。
字符串函数【C语言-3】_第2张图片
我们可以观察到分割符.@被修改为\0,并且依次返回每一段标记的的首地址。在理解了strtok函数的机制之后,我们可以把代码写的更加简介一点,如下代码。

#include 
#include 

int main()
{
	char arr[] = "www.baidu@qq123456789";
	char arr2[50] = { 0 };
	strcpy(arr2, arr);
	const char* p = ".@";
	char* ret = NULL;
	for (ret = strtok(arr2, p); ret != NULL;ret = strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

▶️strtok函数模拟实现

#include 
#include 

char* my_strtok(char* arr, const char* p)
{
	static char* val = NULL;
	if (arr != NULL)
	{
		val = arr;
	}
	else
	{
		val++;
		arr = val;
	}
	if (*val == '\0')
	{
		return NULL;
	}
	else
	{
		while (*val != '\0')
		{
			for (int i = 0; *(p + i) != '\0'; i++)
			{
				if (*val == *(p + i))
				{
					*val = '\0';
					return arr;
				}
			}
			val++;
		}
		return arr;
	}
}

int main()
{
	char arr[] = "www.baidu@qq123456789";
	char arr2[50] = { 0 };
	strcpy(arr2, arr);
	const char* p = ".@";
	char* ret = NULL;
	for (ret = my_strtok(arr2, p); ret != NULL; ret = my_strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

strerror函数

char * strerror ( int errnum );
错误打印函数

  • erenum是错误码,在传给strerror函数一个错误码后,函数会返回一个地址,根据地址可以打印错误信息。
  • 错误码是C语言库函数里自带的报错时候的错误码。

⛵️strerror函数使用

strerror函数可以利用错误码转换成错误信息,具体转换我们用代码进行观察,如下代码。

#include 
#include 

int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));
	printf("%s\n", strerror(5));

	return 0;
}

错误信息打印如下图。
字符串函数【C语言-3】_第3张图片
我们可以看到,每个错误码都对应着不同的错误信息,我们在程序的设计中,合理的运用strerror函数可以帮助我们更快的找到错误的出处。

✈️总结

本章介绍了两个字符串函数strtok函数和strerror函数,strtok函数的使用需要注意它的一些特别之处,strerror函数是根据错误码打印错误信息,可以帮助我们快速的找出程序的错误,我们在这就不对strerror函数进行模拟实现。字符串函数的介绍在这里也就告一段落了,希望大家多多支持,如有错误之处还望指正。
字符串函数【C语言-3】_第4张图片

你可能感兴趣的:(字符串函数,c语言,c++,算法)