2012-11-03 58 views
0

可能重複:
strtok giving Segmentation Fault的strtok() - 分割故障

我嘗試使用strtok的功能在許多令牌分割字符串,但在這個例子中,它返回我SEG。故障錯誤。我在哪裏錯了?

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

int main(int argc, char** argv){ 
    int i=0; 
    char * string = "HI:HOW:ARE:YOU:?", *tmp; 

    while(1){ 
     if(i==0) tmp=strtok(string,":"); 
     else tmp=strtok(NULL,":"); 
     if(tmp==NULL) break; 
     printf("%s\n",tmp); 
     i++; 
    } 
    return 1; 
} 
+0

'strtok'修改傳遞給它的字符串,並且將字符串文字傳遞給它。 –

+0

Soooooo這個問題的許多愚蠢。此外,請**閱讀您嘗試使用的功能的文檔**。 – 2012-11-03 11:56:30

回答

3

變化

char * string = "HI:HOW:ARE:YOU:?" 

char string [] = "HI:HOW:ARE:YOU:?" 

用字符串[]你有一個數組,與char *你有一個指針。當你聲明一個數組時,它會請求空間來分配你的字符串的大小。 char *字符串創建一個指向文字字符串的指針。

使用char *字符串的問題是,該點不應當被改變,因爲字符串文字通常存儲在只讀存儲器,因此引起undefined behavior 33

(對於更詳細閱讀本https://www.securecoding.cert.org/confluence/display/seccode/STR30-C.+Do+not+attempt+to+modify+string+literals

因此,由於strtok字符串的內容被修改,並分解成更小的字符串(令牌),你有問題。

+0

是的,這是解決方案,但請解釋它爲什麼。 – 2012-11-03 11:57:20

+0

@ H2CO3這是因爲這個權利? – dreamcrash

+0

差不多,第二部分在技術上是正確的,雖然它的理論原因是未定義的行爲;這也與指針與數組問題無關。 – 2012-11-03 13:38:53