【函数重现】- strtok 函数

函数重现系列导航


1. 函数简介

strtok 函数为 C 库函数之一,用于分割字符串。

  • 原型:char* strtok (char* str, const char* delim);
  • 所属头文件:<string.h>
  • 功能:使用 delim 指向的字符串中的字符分解 str 指向的字符串,str 指向的字符串中与 delim 指向的字符串的交集的字符都将被“\0”替换,达到分割的效果。当 str 为 NULL 时,函数将对上一次函数调用所分割的剩余字符串继续进行分割。
  • 返回:分割得到的子字符串,无法继续进行分割时将返回 NULL。

2. 使用示例

int main()
{
	char str[80] = " - www.baidu.com - webs -";
	const char* delim = "- ";
	char* token = NULL;
	
	/* 获取第一个子字符串 */
	token = strtok(str, delim);

	/* 继续获取其他的子字符串 */
	while (token != NULL) 
	{
		printf("%delim\n", token);
		token = mystrtok(NULL, delim);
	}
}

程序运行结果如下:

www.baidu.com
webs

可见,“- www.baidu.com - webs -” 中的“-”与“”两字符都被“\0”所替换,字符串被切割为“www.baidu.com”与“webs”两子串。


3. 函数说明

  • 既然为 strtok 函数的重现,那么所重现的 strtok 函数的基本功能、调用方法应与原库函数保持一致。
  • strtok 函数内部使用一个静态局部指针指向传参目标字符串,这样当 str 为 NULL 时能够继续对上一次函数调用所分割的剩余字符串的进行分割。
  • 每次函数调用只分割一段子字符串,且需要对 str 的前部分字符为替换字符的情况进行处理,保证返回正确的切割子字符串。

4. 函数重现

char* strtok (char* str, const char* delim)
{
	// 计算替换字符串的长度
	int len = 0;
	const char* p = delim;
	while (*p++ != '\0')
	{
		len++;
	}

	// 使用 static 类型指针保存上一次函数调用时的字符串地址
	static char* pstr = NULL;
	if (str != NULL)
	{
		pstr = str;
	}

	// 保证 pstr 指向以非替换字符为首的子字符串
	while (*pstr != '\0')
	{
		int i = 0;
		for (; i < len; i++)
		{
			if (delim[i] == *pstr)
			{
				*pstr = '\0';
				break;
			}
		}

		if (i == len)
		{
			break;
		}
		else
		{
			pstr++;
		}
	}	

	// ret 保存返回子字符串的首地址
	char* ret = (*pstr != '\0') ? pstr : NULL;

	while (*pstr != '\0')
	{
		int i = 0;
		for (; i < len; i++)
		{
			if (delim[i] == *pstr)
			{
				// pstr 最后指向替换字符的下一字符,此时已得到一个切割的子字符串
				*pstr++ = '\0';
				return ret;
			}
		}

		pstr++;
	}
	
	return ret;
}
发布了60 篇原创文章 · 获赞 36 · 访问量 5918

猜你喜欢

转载自blog.csdn.net/qq_35692077/article/details/103100787