在C循环中使用strtok()?

我想在嵌套循环中使用strtok()。 但是这并没有给我想要的结果。 可能是因为他们正在使用相同的内存位置。 我的代码是这样的forms:

char *token1 = strtok(Str1, "%"); while(token1 != NULL ) { char *token2 = strtok(Str2, "%"); while(token2 != NULL ) { //DO SMTHING token2 = strtok(NULL, "%"); } token1 = strtok(NULL, "%"); // Do something more } 

是的, strtok()确实使用了一些静态内存来保存调用之间的上下文。 如果使用VS(与strtok_r()相同strtok_s() ,则使用strtok()strtok_r()的可重入版本,或使用strtok_r() )。

它有一个额外的上下文参数,您可以在不同的循环中使用不同的上下文。

 char *tok, *saved; for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved)) { /* Do something with "tok" */ } 

strtok正在使用一个静态缓冲区。 在你的情况下,你应该使用strtok_r。 该function使用用户提供的缓冲区。

WayneAKing在微软开发者中心发布了一个替代scheme 。

引用他:

到这里

http://cpp.snippets.org/code/

并下载这个文件

Stptok.C改进的标记function

您也可以从同一个站点下载所需的头文件。

这是strtok的一个修改版本,它将parsing的标记(子string)放在一个单独的缓冲区中。 您应该能够修改它以适应您的需求。

  • 韦恩

PS – 请注意,这些文件可能是相对于行尾的* nix格式。 即 – 0x0A而不是0x0D 0x0A

如果您的环境中没有Microsoft库,则可以select这种方法。

希望它能帮助别人:)