2011-08-17 50 views
3

可能重複:
strtok giving Segmentation Faultstrtok的段錯誤

爲什麼會出現段錯誤使用此代碼?

void test(char *data) 
{ 
    char *pch; 
    pch = strtok(data, " ,.-"); // segfault 
    while (pch != NULL) 
    { 
     printf("%s\n", pch); 
     pch = strtok(NULL, " ,.-"); 
    } 

    return NULL; 
} 

char *data = "- This, a sample string."; 
test(data); 
+2

這已經被問[多](http://stackoverflow.com/questions/2385697/strtok-giving-segmentation-fault)[次](HTTP:// stackoverflow.com/questions/5925405/problem-with-strtok-and-segmentation-fault)[before](http://stackoverflow.com/questions/272876/cs-strtok-and-read-only-string-literals) 。 –

回答

15

strtok()修改原始字符串。你正在傳遞一個常量源字符串,無法修改。

試試這個:

char *data = strdup("- This, a sample string."); 
test(data); 
+5

或者只是'char data [] =「 - 這是一個樣本字符串。」;' – caf

+0

修改後的代碼將演示一個不會崩潰的版本,因爲編譯時字符串文字被複制到一個新的堆分配緩衝區,允許strtok工作。 – Matt

+2

雖然這會導致內存泄漏,除非您在完成後記得釋放數據。 – Mikola

3

strtok修改字符串。你傳遞一個指向只讀數據的指針(一個字符串常量)。

嘗試使用char數組。

char data[] ="- This, is a sample string." 
test(data);