2009-10-02 36 views
11

我想在嵌套循环中使用strtok()。但是这并没有给我想要的结果。 可能是因为它们使用相同的内存位置。我的代码的形式为: -在C中的循环中使用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

所以,现在你知道为什么人们不使用'的strtok()'如果能避免它。这很难正确使用。 – 2009-10-02 17:26:12

回答

19

是,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" */ 
} 
+2

如果您没有编辑'strtok'这样的行为的原因,这里有一些关于'strtok_r'的更多信息:http://www.mkssoftware.com/docs/man3/strtok_r.3.asp – Welbog 2009-10-02 13:59:10

+0

@ ChrisF:问题不在于分隔符或他存储令牌的位置,而是“strtok”只能在任何给定时间标记一个字符串的事实。 'strtok_r'通过使用另一个参数来记录它的状态来解决这个问题。 – Welbog 2009-10-02 14:02:17

+0

有人能解释一下上面的循环是如何工作的吗? – MortalMan 2015-04-06 21:06:00

1

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

0

WayneAKing在Microsoft Developer Center中发布an alternative

援引他:

转到这里

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

和下载此文件

Stptok.C改进符号化 功能

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

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

  • 韦恩

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

如果你的环境中没有Microsoft库,这是一个替代方案。

希望它可以帮助别人:)