2016-10-03 32 views
0

這是我a4.c主要方法中的循環調用patternsearch功能:Ç - 最後調用函數再次被印刷

while(!feof(stdin)) { 
scanf("%s", &word); 
patternSearch(grid, word); 
} 

出於某種原因,我想不通,這個打印最後調用patternsearch兩次:

例如,看一下我的輸出TEST3:

Found "tip" at 0 2, L 
Found "pop" at 0 0, D 
Found "pop" at 2 0, U 
Found "key" at 0 3, D 
Found "key" at 2 1, R 
"nope" - Not Found 
"nope" - Not Found 

正如你所看到的,對於「沒了」測試結果打印兩次。 :(

我想我的問題是類似的一個在這裏說: Last line being printed twice (C++) ,但我不知道

回答

0

這裏的問題是,FEOF()只有當我真正打EOF字符返回真。
這意味着我正在調用scanf(),並擊中EOF; 這意味着循環將不會重複,但我已經在它的中間。
但是,如果scanf()函數成功地讀取了我所要求的內容,它實際上只會改變它的參數。 ,因爲它失敗(通過擊中EOF), 它不會改變字符數組,它將仍然包含之前做過的任何事情(即前一個字)。

我檢查了scanf()的返回值;它返回的數字,這是它將新值賦予的參數的數量; 如果小於1,那麼我實際上沒有得到一個新的字符串(我認爲它也顯式返回EOF,如果它碰到文件結束; EOF是#defined常量,在大多數平臺上等於-1,所以< 1檢查將無論如何工作)。

這是最後的工作代碼:

while(!feof(stdin)) { 
    if (scanf("%s", &word) < 1) 
     break; 
    patternSearch(grid, word); 
    } 
1

步驟1中的任何問題涉及輸入:測試從輸入功能返回值如果

  1. feof()檢查一個之前讀導致最終的文件,它不會報告對未來的讀取。

  2. 代碼遇到意外的結果scanf("%s", &word);,但代碼沒有檢查從scanf()返回的值。弱代碼不檢查返回值。健壯的代碼確實如此。研究scanf()及其返回值的正確使用。

  3. 不要使用沒有寬度限制的"%s"

  4. &scanf("%s", &word);可能不需要。需要看到word聲明是肯定的。

    char word[100]; 
    while (scanf("%99s", word) == 1) { 
        patternSearch(grid, word); 
    }