为了理解
strtok()
的工作原理,首先需要知道什么是
静态变量。
这个链接解释得非常清楚...
strtok()
操作的关键是保留上一次调用之间最后一个分隔符的位置(这就是为什么在连续调用中使用
null指针
时,
strtok()
会继续解析传递给它的原始字符串)...
看一下我自己的
strtok()
实现,名为
zStrtok()
,其功能与
strtok()
提供的略有不同。
char *zStrtok(char *str, const char *delim) {
static char *static_str=0;
int index=0, strlength=0;
int found = 0;
if (delim==0 || (str == 0 && static_str == 0))
return 0;
if (str == 0)
str = static_str;
while(str[strlength])
strlength++;
for (index=0;index<strlength;index++)
if (str[index]==delim[0]) {
found=1;
break;
}
if (!found) {
static_str = 0;
return str;
}
if (str[0]==delim[0]) {
static_str = (str + 1);
return (char *)delim;
}
str[index] = '\0';
if ((str + index + 1)!=0)
static_str = (str + index + 1);
else
static_str = 0;
return str;
}
这里是一个使用示例
Example Usage
char str[] = "A,B,,,C";
printf("1 %s\n",zStrtok(s,","));
printf("2 %s\n",zStrtok(NULL,","));
printf("3 %s\n",zStrtok(NULL,","));
printf("4 %s\n",zStrtok(NULL,","));
printf("5 %s\n",zStrtok(NULL,","));
printf("6 %s\n",zStrtok(NULL,","));
Example Output
1 A
2 B
3 ,
4 ,
5 C
6 (null)
这段代码来自我在Github上维护的
字符串处理库,名为zString。可以查看代码,甚至做出贡献 :)
https://github.com/fnoyanisi/zString
strtok()
在返回结果之前,会修改输入的字符串并用空字符(NUL)作为分隔符。如果您试图在连续调用strtok()
之间检查整个缓冲区(即str[]),您会发现它已经被修改了。 - Michael FoukarakisNULL
,它会保存最后一个返回结果并从下一个字符继续搜索。这显然使它不是线程安全的,一次只能有一个标记化活动。参考 - DCoder