2009-10-02 37 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庫,這是一個替代方案。

希望它可以幫助別人:)