strtok函数不是你在程序中应该仿效的模型,strtok 在函数使用内部静态变量记录字符串中下一个需要解析的标记的当前位置。但是,由于指示这个位置的变量值有一个,那么,在同一个程序中出现多个解析不同字符串的strtok调用时,对各自的字符串的解析就可能会相互的干扰。如:对“a/bbb///ccc;xxx:yyy:” 分别进行":;"和"/"解析。
代码如下strtok:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j;
if (argc != 4)
{
fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]);
exit(EXIT_FAILURE);
}
for (j = 1, str1 = argv[1]; ; j++, str1 = NULL)
{
token = strtok(str1, argv[2]);
if(token == NULL)
break;
printf("%d: %s\n", j, token);
for(str2 = token; ; str2 = NULL)
{
subtoken = strtok(str2, argv[3]);
if (subtoken == NULL)
break;
printf(" --> %s\n", subtoken);
}
}
exit(EXIT_SUCCESS);
return 0;
}
输出结果:
1:a/bbbccc
--> a
--> bbb
--> ccc
没有达到预想的结果
strtok_r代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j;
if (argc != 4)
{
fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]);
exit(EXIT_FAILURE);
}
for (j = 1, str1 = argv[1]; ; j++, str1 = NULL)
{
token = strtok_r(str1, argv[2], &saveptr1);
if(token == NULL)
break;
printf("%d: %s\n", j, token);
for(str2 = token; ; str2 = NULL)
{
subtoken = strtok_r(str2, argv[3], &saveptr2);
if (subtoken == NULL)
break;
printf(" --> %s\n", subtoken);
}
}
exit(EXIT_SUCCESS);
return 0;
}
运行结果:
1:a/bbbccc
--> a
--> bbb
--> ccc
2:xxx--> xxx
3: yyy
--> yyy
和预想的结果吻和。我们可以看到在strtok_r函数中多了一个形参saveptr,这个形参替换了strtok中的静态变量,用来存储系一个解析的存储单元地址。