2017-04-18 41 views
-3

我正在編寫一個程序,它使用getchar從用戶處獲取字符並對它們進行計數。當用戶輸入EOF時,它應該停止,打印出字符數並打印完成。代碼:關於EOF的getchar的奇怪行爲

char cur = 0; 
int count = 0; 
while((cur = getchar()) != EOF){ 
    ++count; 
} 
printf("\n%d", count); 
printf("\ndone\n"); 

但是,循環不停止,直到用戶輸入2個連續的EOF。 我試圖強制循環停止通過手動檢查如果字符是EOF和打破循環,但它似乎並沒有工作。

如何在一次EOF後停止?

+0

用戶如何「輸入」EOF?這不是關鍵,而是以某種方式發出信號的條件。你按什麼鍵? – chux

+1

鍵入的EOF鍵(Linux上的「Ctrl-D」,Windows上的Ctrl-Z)必須是'newline'後面的第一個字符。即使如此,我還沒有弄清楚它爲什麼有時需要鍵盤上的一個以上'EOF'。 –

+1

我在Linux上使用CTRL + D –

回答

2

getchar函數聲明返回int而不是char。因爲您將結果分配給char,您將無法捕獲EOF。

將數據類型cur更改爲int

編輯:

這很可能與您的終端如何處理EOF有關。當我測試這個時,如果我在一行中輸入一個或多個字符,然後按CTRL-D,則字符(減去CTRL-D)將被髮送到程序並由getchar讀取。如果我自己按CTRL-D一行,即使按ENTER鍵輸入上一行,然後檢測到EOF。

如果您要將文件重定向到該程序的stdin中,您會看到在到達文件末尾時會檢測到EOF。

+2

因此,如果第一個EOF不能從字符中識別,那麼爲什麼第二個? – Yunnosch

+0

謝謝,像魔術一樣被喚醒,但這個問題仍然令我感興趣,爲什麼第二次工作,但不是第一次? –