【无标题】C++ 循环体内外均用到 strtok 踩坑

当 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() 函数的一个扩展,它能够指定剩余字符的存放位置,这就不会引起上述被覆盖的问题了。

猜你喜欢

转载自blog.csdn.net/qq_42194665/article/details/131604919