2011-08-17 49 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);