2017-05-05 119 views
-6

我有鏈接列表與歌曲的詳細信息,並希望比較兩個歌曲名稱...額外的任務是比較他們有更多相似的詞比不同的單詞...我使用strtok一字一句地檢查它,然後檢查當前單詞是否包含在其他名字中......但是當我這樣做的時候,strtok清除了我的字符串,除了第一個單詞......我該如何逃避?strtok刪除我的字符串,除了第一個標記

while (next_token) 
      { 
       currentCounter++; 
       if (searchword(temp->author, next_token)==1) 
       { 
        counter++; 
       } 
       next_token = strtok(NULL, " "); 

      } 
+7

您是否閱讀過有關'strtok(*)* * * *的文檔? – EOF

+4

'strtok()'通過用空字節覆蓋分隔符來工作,以便每個標記都變成一個單獨的字符串。如果您需要原始字符串,請在使用'strtok()'之前複製它。 – Barmar

+0

no no ....例如temp-> author是「bon jovi」....在第一次迭代時next_token獲得「bon」,但第二次刪除了temp-> author之外的所有內容,除了「bon」並且不能轉到next token –

回答

2

strtokstrtok通過用0覆蓋分隔符來修改輸入數組;並不是第一個標記之後的所有東西都被刪除或清除,只是在第一個標記之後有一個字符串終結符,因此在打印之後沒有任何東西。

例如:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int main(void) 
{ 
    char str[] = "This is a test"; 
    printf("before strtok: "); 
    for (size_t i = 0; i < sizeof str; i++) 
    { 
    if (isprint(str[i])) 
     putchar(str[i]); 
    else 
     putchar('.'); 
    } 
    putchar ('\n'); 

    char *token = strtok(str, " "); 
    while (token) 
    { 
    printf("token = %8s, str = ", token); 
    for (size_t i = 0; i < sizeof str; i++) 
    { 
     if (isprint(str[i])) 
     putchar(str[i]); 
     else 
     putchar('.'); 
    } 
    putchar('\n'); 
    token = strtok(NULL, " "); 
    } 

    printf("after all strtok: "); 
    for (size_t i = 0; i < sizeof str; i++) 
    { 
    if (isprint(str[i])) 
     putchar(str[i]); 
    else 
     putchar('.'); 
    } 
    putchar('\n'); 

    return 0; 
} 

這裏的輸出(.在這種情況下,代表0):

before strtok: This is a test. 
token =  This, str = This.is a test. 
token =  is, str = This.is.a test. 
token =  a, str = This.is.a.test. 
token =  test, str = This.is.a.test. 
after all strtok: This.is.a.test. 

strtok電話後,所有其他標記仍然存在,但由於我們用0覆蓋空格,所有常規文本處理例程(strcpy,strcat,printf,puts等)只能看到第一個標記。

如果要保留原始字符串的內容,則必須將它們複製到另一個緩衝區並在該緩衝區上執行strtok調用。

+0

非常感謝John Bode! –