【问题标题】:Using strtok() in nested loops in C?在 C 的嵌套循环中使用 strtok()?
【发布时间】:2010-12-03 08:07:23
【问题描述】:

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

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

【问题讨论】:

  • 所以,现在你知道为什么人们不使用strtok(),如果他们可以避免的话。很难正确使用。

标签: c string strtok


【解决方案1】:

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

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

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

【讨论】:

  • 如果您不编辑 strtok 的行为原因,这里有一些关于 strtok_r 的更多信息:mkssoftware.com/docs/man3/strtok_r.3.asp
  • 有人能解释一下上述循环是如何工作的吗?
  • @MortalMan:该循环本身可以使用strtok()strtok_r()(或Microsoft strtok_s()),只需对strtok() 的不同调用约定进行少量更改。它只是简单地遍历str 中的令牌。使用strtok_r() 的不同之处在于,您也可以使用strtok_r() 和一个不同的变量代替saved 的内部循环,并且内部循环不会干扰外部循环。这不能strtok()来完成。
【解决方案2】:

strtok 正在使用静态缓冲区。 在您的情况下,您应该使用 strtok_r。该函数正在使用用户提供的缓冲区。

【讨论】:

    【解决方案3】:

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

    引用他:

    去这里

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

    并下载此文件

    stptok.c 改进的标记化 功能

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

    这是 strtok 的修改版本 放置解析的标记 (子字符串)在单独的缓冲区中。你 应该能够将其修改为 满足您的需求。

    • 韦恩

    附: - 请注意,这些文件可能在 *nix 格式相对于行尾。即 - 仅 0x0A 而不是 0x0D 0x0A

    如果您的环境中没有 Microsoft 库,这是一种替代方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多