我试图在嵌套循环中使用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
}
答案 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。
引用他:
去这里
并下载此文件
Stptok.C改进了标记化 功能
您也可以下载所需的 来自同一网站的头文件。
这是strtok的修改版本 放置解析的标记 (子串)在一个单独的缓冲区中。您 应该能够修改它 满足您的需求。
- 韦恩
P.S。 - 请注意,这些文件可能在 *关于行尾的nix格式。即 - 仅0x0A而不是 0x0D 0x0A
如果您的环境中没有Microsoft库,则可以选择此选项。
希望它能帮助别人:)