网上的很多关于strtok的说明感觉都不是太对,以下是我结合网上的资料以及自己实际测试后的结果,略带推测出来的strtok的用法。
头文件:
函数strtok在<string.h>中。
strtok函数原理与使用方法:
第一次调用:strtok(char *s,char *delim),其中字符串delim是分隔识别符,在s中寻找首次出现在delim中的字符,把该字符替换为\0。如果找不到,不对原字符串进行改变。
第二次调用:把第一个参数设为NULL,第二个参数含义不变。strtok(char *s,NULL)。
返回值:
每次的返回值返回分隔后的下一个字符串的首地址。注意,分隔完成后原字符串已经被被改变了。
具体实例及详解:
先来一段最正常的例子
#include <stdio.h>
#include <string.h>
int main()
{
char *p;
char s[100];
strcpy(s, "56,aa,67&8");
//1
p = strtok(s, ",");
printf("%s\n", p);
//2
p = strtok(NULL, ",");
printf("%s\n", p);
//3
p = strtok(NULL, ",");
printf("%s", p);
return 0;
}
很显然最后结果为
56
aa
67&8
详解如下
首次调用从第一个字符开始查找",",找到后将其替换为\0,返回给p,输出从第一个字符到替换的\0为止。此时原字符串变为"56\0aa,67&8"。
然后,第二次调用strtok从字符a开始,找到","替换为\0,输出。第二次strtok之后原字符串变为"56\0aa\067&8"。
最后一次输出剩下的字符。
“另一种解释”
好,上述解释看起来没什么毛病。那么,我在此提出一个问题:
有些人说其实在第一次调用strtok就把整个字符串中所有的","全部替换为了\0,之后只不过是在第一次的基础上输出,也就是说只有第一次调用strtok进行了替换。你认为对不对?
经过我的验证,我认为是不对的。看以下代码。
#include <stdio.h>
#include <string.h>
int main()
{
char *p;
char s[100];
strcpy(s, "56,aa,67&8");
//1
p = strtok(s, ",");
printf("%s\n", p);
//2
p = strtok(NULL, "&");
printf("%s\n", p);
//3
p = strtok(NULL, ",");
printf("%s", p);
return 0;
}
在之前的代码基础上稍加修改,把第二次调用的分隔参数改为"&"。结果为
56
aa,67
8
倘若在第一次调用后就变为"56\0aa\067&8",那么第二次输出应该还是aa。而结果不是这样,说明第一次调用只替换了第一个","。
深入理解
内容就这些,下面是我写的一些小练习,可以尝试解释一下输出结果。不懂的可以在评论区交流。
#include <stdio.h>
#include <string.h>
int main()
{
char *p;
char s[100];
strcpy(s, "56,aa,67&8");
//1
p = strtok(s, ",&");
printf("%s\n", p);
//2
p = strtok(NULL, ",&");
printf("%s\n", p);
//3
p = strtok(NULL, ",");
printf("%s", p);
return 0;
}
输出结果:
56
aa
67&8
#include <stdio.h>
#include <string.h>
int main()
{
char *p;
char s[100];
strcpy(s, "56,aa,67&8");
//1
p = strtok(s, ",&");
printf("%s\n", p);
//2
p = strtok(s, ",&");
printf("%s", p);
return 0;
}
输出结果:
56
56
#include <stdio.h>
#include <string.h>
int main()
{
char *p;
char s[100];
strcpy(s, "56,aa,67&8");
//1
p = strtok(s, "&");
printf("%s\n", p);
//2
p = strtok(s, ",&");
printf("%s", p);
return 0;
}
输出结果:
56,aa,67
56
#include <stdio.h>
#include <string.h>
int main()
{
char *p;
char s[100];
strcpy(s, "56,aa,67&8");
//1
p = strtok(s, ",&");
printf("%s\n", p);
//2
p = strtok(s, ",&");
printf("%s\n", p);
//3
p = strtok(NULL, ",&");
printf("%s", p);
return 0;
}
输出结果:
56
56
(null)