2013-12-21 40 views
-1

代碼非常簡單。我不明白爲什麼當我嘗試打印出pointok2時,程序崩潰。也許我沒有看到問題,因爲我累了或什麼。一點幫助,將不勝感激。爲什麼strtok不工作?

Tokmain將始終爲格式「單詞」。

scanf("%s",&tokmain); 
for(i=0;i<50;i++) { 
    if (tokmain[i]=='\n') { 
     tokmain[i]='\0'; 
     lettercount=i; 
     break; 
    } 
} 
pointok1=strtok(tokmain,delim); 
pointok2=strtok(NULL,delim); 

puts(pointok1); 
puts(pointok2);` 
+2

什麼是'delim'的價值? – Hariprasad

+0

同意^,分隔符可能非常重要。 –

回答

1

scanf()在空間截斷。因此,當您輸入「單詞」時,tokmain將只有「單詞」。

嘗試

scanf("%49[^\n]s",&tokmain); /*Notice the format string*/ 

for(i=0;i<50;i++) { 
    if (tokmain[i]=='\n') { 
     tokmain[i]='\0'; 
     lettercount=i; 
     break; 
    } 
} 
pointok1=strtok(tokmain,delim); 
pointok2=strtok(NULL,delim); 

puts(pointok1); 
puts(pointok2);` 
+2

使用'「%49 [^ \ n]」'可能更容易。使用長度有限的格式字符串很好。如果你測試了'scanf()'的返回值以確保它獲得了一些數據,那麼也會更令人放心。最後,由於'strtok()'如果不喜歡它,它可以返回'NULL',所以在試圖通過'puts()'打印它們之前測試'pointok1'和'pointok2'爲null可能是明智的,哪些對象爲空指針(即,如果將空指針傳遞給'puts()'以及可能發生的任何事情(包括崩潰),則調用未定義的行爲)。 –

+0

@JonathanLeffler:對,我編輯了格式字符串。 – Hariprasad

+0

謝謝你回覆我發佈的內容,但是我改變了我發佈的這個內容。我用fgets和fgets改變了scanf似乎根本不起作用。當你想出它時,delim是一個空間。我還寫了一個請檢查你所建議的NULL,即使我總是有一個輸入。你可能知道什麼導致fgets不起作用? fgets(tokmain,50,stdin)這就是我在開始時要發佈的內容,並用它替換換行符fgets。 – user3126084