14

我正在尝试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, "%");
}
4

3 回答 3

23

是的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" */
}
于 2009-10-02T13:57:21.887 回答
2

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

于 2009-10-02T14:01:59.457 回答
1

WayneAKing在 Microsoft 开发人员中心发布了替代方案。

引用他的话:

到这里

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

并下载此文件

stptok.c 改进的标记化功能

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

这是 strtok 的修改版本,它将解析的标记(子字符串)放在单独的缓冲区中。您应该能够对其进行修改以满足您的需要。

  • 韦恩

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

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

于 2010-05-20T15:17:16.237 回答