首页 文章

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

提问于
浏览
11

我试图在嵌套循环中使用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 回答

  • 1

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

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

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

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

  • 20

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

    引用他:

    访问http://cpp.snippets.org/code/并下载此文件Stptok.C改进的标记化功能您还可以从同一站点下载所需的 Headers 文件 . 这是strtok的修改版本,它将解析后的标记(子字符串)放在一个单独的缓冲区中 . 您应该能够修改它以满足您的需求 . 韦恩P.S. - 请注意,这些文件的行尾可能是* nix格式 . 即 - 仅0x0A而不是0x0D 0x0A

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

    希望它能帮助别人:)

相关问题