在C中的循环中使用strtok()?

时间:2009-10-02 13:55:11

标签: c string strtok

我试图在嵌套循环中使用strtok()。但这并没有给我预期的结果。 可能是因为他们使用相同的内存位置。我的代码形式如下: -

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
 }

3 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:1)

strtok正在使用静态缓冲区。 在你的情况下,你应该使用strtok_r。此功能使用用户提供的缓冲区。

答案 2 :(得分:0)

WayneAKing在Microsoft开发人员中心发布了an alternative

引用他:

  

去这里

     

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

     

并下载此文件

     

Stptok.C改进了标记化   功能

     

您也可以下载所需的   来自同一网站的头文件。

     

这是strtok的修改版本   放置解析的标记   (子串)在一个单独的缓冲区中。您   应该能够修改它   满足您的需求。

     
      
  • 韦恩
  •   
     

P.S。 - 请注意,这些文件可能在   *关于行尾的nix格式。即 - 仅0x0A而不是   0x0D 0x0A

如果您的环境中没有Microsoft库,则可以选择此选项。

希望它能帮助别人:)