目录
一、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;
}