详解 strtok 函数以及模拟实现

目录

一、strtok 函数的介绍

二、strtok 函数的模拟实现 



一、strtok 函数的介绍

函数原型

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

delimiter n.[计]分隔符,定界符(a character that marks the beginning or end of a unit of data)

token n.(用以启动某些机器或用作支付方式的)代币,专用辅币;代金券;象征,标志;(语言学)符号

token 在计算机身份认证中是令牌(临时)的意思,代表执行某些操作的权力的对象

token 在在词法分析中是标记的意思

多次调用 strtok 函数,将 str 拆分成 tokens,这些标记是由 delimiters 中的任意字符分隔的连续字符序列

第一次调用 strtok 函数时,需要给参数 str 传一个字符串,字符串的第一个字符作为扫描标记的起始位置。在后续调用中,则需要给参数 str 传一个 NULL 指针,此时使用上一个标记结尾之后的位置作为扫描的新起始位置

为了确定标记的开头和结尾,strtok 函数首先从起始位置扫描,找到第一个 delimiters 中未包含的字符(该字符将成为标记的开头),然后从标记的开头开始扫描,找到第一个 delimiters 中包含的字符(该字符将成为标记的结尾),如果找到了 '\0',扫描也会停止

标记的结尾将自动替换成 '\0',令牌的开头将由函数返回

在对 strtok 函数的调用中,一旦遇到了 '\0',则对此函数的所有后续调用(以 NULL 指针作为第一个参数)都将返回 NULL 指针

例如

#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "Oh, this is a sample string";
	char buf[30] = { 0 };
	strcpy(buf, str);
	printf("Splitting string \"%s\" into tokens:\n", buf);
	char* ps = strtok(buf, ", ");
	while (ps != NULL)
	{
		printf("%s\n", ps);
		ps = strtok(NULL, ", ");
	}
	return 0;
}

strtok 函数会改变被操作的字符串,所以使用 strtok 函数拆分的字符串一般都是临时拷贝的内容,并且可修改。  

二、strtok 函数的模拟实现 

char* my_strtok(char* str, const char* delimiters)
{
	// 使用静态变量 pch 记录每次扫描的起始位置
	static char* pch = NULL;
	if (str != NULL)
	{
		pch = str;
	}
	// 生成分隔符查找表
	char table[256] = { 0 };
	while (*delimiters != '\0')
	{
		table[*delimiters++] = 1;
	}
	// 找到第一个 delimiters 中未包含的字符(该字符将成为标记的开头)
	while (*pch != '\0' && table[*pch] == 1)
	{
		pch++;
	}
	char* ret = *pch != '\0' ? pch : NULL;  // 判断找到与否
	// 找到第一个 delimiters 中包含的字符(该字符将成为标记的结尾)
	while (*pch != '\0' && table[*pch] == 0)
	{
		pch++;
	}
	if (*pch != '\0')
	{
		*pch++ = '\0';  // 将标记的结尾替换为 '\0',结尾之后的位置作为下一次扫描的起始位置
	}
	return ret;
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值