2015-08-20 67 views
0

我有這樣的代碼在我的程序:分段故障用於fgets() - 用C

char* tok = NULL; 
char move[100]; 

if (fgets(move, 100, stdin) != NULL) 
{ 
    /* then split into tokens using strtok */ 
    tok = strtok(move, " "); 

    while (tok != NULL) 
    { 
     printf("Element: %s\n", tok); 
     tok = strtok(NULL, " "); 
    } 
} 

我已經嘗試過,並與fgets後加入printf語句,和前一個被打印出來,但一前一後纔不是。 我不明白爲什麼這與fgets調用導致分割失敗。

如果有人有任何想法,我將非常感激。

感謝 科瑞

+2

難道你還可以使用適當的調試器旁邊線前後分別增加打印?它是在系統庫中的某處顯示調用堆棧,還是僅在程序功能中的最後一個位置?什麼平臺/編譯器? – Yirkha

+4

您可能在程序的其他地方有一個錯誤。它破壞了堆,並且'fgets()'中的錯誤只是一個副作用。 – Barmar

+0

嘿,我還是很新的C,所以我不知道該怎麼做(我是一個Java程序員)。我在Ubuntu上使用GNU編譯器,並使用C99。 – Fishingfon

回答

-2

的strtok的運行時函數是這樣的

第一次調用strtok的你提供你想要來標記

char s[] = "this is a string"; 

在上面的字符串空間似乎是一個字符串是單詞之間的良好的分隔符所以讓我們使用:

char* p = strtok(s, " "); 

現在發生的事情是「S」進行搜索,直到空格字符被發現,則返回第一個令牌(「本」),併爲了得到下一個標記和p指向該標記(串)

現在
p = strtok(NULL," "); 

p指向「是」

依此類推,直到沒有更多的空間可以是:繼續使用相同字符串NULL作爲第一個參數,因爲strtok的維持一個靜態指針到以前通過字符串傳遞找到,那麼最後一個字符串作爲最後一個標記'string'返回。

更方便,你可以把它寫這樣的而不是打印出所有的記號:

for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " ")) 
{ 
    puts(p); 
} 

EDITED位置:

如果你想存儲從strtok的返回值,你需要複製令牌到另一個緩衝區例如的strdup(P);因爲原始字符串(由strtok內的靜態指針指向)在迭代之間被修改以便返回令牌。

+0

這是真的,但OP已經正確使用了strtok –