当 C++ 循环体内外均用到 strtok() 来分割字符串时,编译不会报错,但是结果可能会不对!
strtok() 返回值:
返回被分解的第一个子字符串,剩余的字符串存储在一个静态变量中!!!如果没有可检索的字符串,则返回一个空指针。
适用情况案例:
char *p = strtok(str1, ",");
while(p){
char *pp = strtok(str2, "/");
while(pp){
code1
pp = strtok(NULL, "/");
}
code2
p = strtok(NULL, ",");
}
我们希望的是内循环和外循环的循环条件互不影响。但是由于 strtok() 会将剩余的字符串存储在一个静态变量中,即第一次外循环开始时,str1 的剩余字符串放在了一个静态变量中。当内循环调用 strtok() 时,str2 的剩余字符串同样会放在这个静态变量中,这意味着 str1 的剩余变量被替换了!!那么当内循环结束时,外循环会紧接着退出循环,因为此时 p 与 pp 一致为空指针了。
不知道讲清楚了没有,希望能够帮到一些同志吧。
代替方案:用 strtok_r() 函数。
需要注意的是,好像这个函数得在 Linux 下才能方便使用, windows 的 string.h 中好像不包含它。要想使用这个函数,好像可以找到 linux下的实现源码,复制到你的程序中,或者使用 GNU C Library。(未测)
一个例子:
char *p_ = NULL;
char *p = strtok(str1, ",", &p_);
while(p){
char *pp_ = NULL;
char *pp = strtok(str2, "/", &pp_);
while(pp){
code1
pp = strtok(NULL, "/", , &pp_);
}
code2
p = strtok(NULL, ",", &p_);
}
说明:其实 strtok_r() 函数是 strtok() 函数的一个扩展,它能够指定剩余字符的存放位置,这就不会引起上述被覆盖的问题了。