2014-01-28 127 views
-3

我想分割字符串與strtok,但我不能打印我的字符串的第二部分。如何在C中使用strtok()分割字符串?

int main (void) { 
    char str[128]; 
    char *ptr; 

    strcpy (str, "123456 789asdf"); 
    strtok (str, " ", &ptr); 

    printf ("'%s' '%s'\n", str, ptr); 
    return 0; 
} 

的結果是這樣的:

'123456' '12jfs90123#4' 
+4

如何在使用之前閱讀函數的文檔? – 2014-01-28 20:09:36

+0

除了下面的答案,我想指出你也需要包含適當的頭文件,在這種情況下'#include '。另外,printf應該包含''。 – jpw

回答

1

它看起來像你對我誤解了如何strtok作品。

第二個參數應該指向一個分隔符字符串。 「當前」字符串是返回值。在第一次通話中,您傳遞要分割的字符串。在隨後的調用中,您爲第一個參數傳遞NULL。

strtok也修改您傳遞給它的字符串,所以您必須而不是永遠傳遞一個字符串文字作爲第一個參數。

工作代碼通常看起來至少有一點更是這樣的:

char input[] = "123456 789asdf"; 

char *substring = strtok(input, " "); 

do { 
    printf("%s\n", substring); 
} while (strtok(NULL, " ")); 

但是,如果你知道你只打算找兩個參數,它可能更容易使用scanf

char s1[256], s2[256]; 

sscanf(str, "%255s %255s", s1, s2); 
+0

也可能OP正在嘗試'strtok_r' – P0W

1

strtok()作品有點不同於你使用它的方式:

char str[] = "123456 789asdf"; 

char* token = strtok (str, " "); 
char* token2 = strtok (NULL, " "); 
printf ("'%s' '%s'\n", token, token2); 

輸出所需的內容:'123456' '789asdf'

+0

http://ideone.com/yPmUuz – P0W

1

您需要繼續調用strtok,直到它返回NULL,因爲strtok會在每次函數調用時返回一個由分割產生的令牌。 這是代碼:

int main (void) { 
    char str[128]; 
    char *ptr; 

    strcpy (str, "123456 789asdf"); 
    ptr = strtok (str, " "); 

    while(ptr != NULL) 
    { 
     printf ("'%s'\n", ptr); 
     ptr = strtok(NULL, " "); 
    } 

    return 0; 
}