getchar()和scanf("%c",ch)在用EOF判斷結束時的區別
1、getchar()
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF)
putchar(c);
return 0;
}
如果輸入hello回車,輸出結果如下:
hello
hello
i.此時再輸入ctrl+Z(即Windows下的EOF表示),程式結束。
ii.如果輸入hello之後不輸入回車,而是EOF,此時程式並沒有結束,而是可以繼續輸入,但並不換行。
這說明,getchar()從輸入緩衝區中讀取資料時,只有EOF值位於第一位置時or讀取出錯時,才會返回EOF值
【The return value is EOF for an error or if the end-of-file character or the end-of-string character is encounteredin the first attempt to read a character.】
2. scanf("%c", &ch)
#include <STDIO.H> int main() { char ch; while(scanf("%c", &ch) != EOF) { printf("%c",ch); } return 0; }
我在Windows XP系統中,用VC++6.0測試,當輸入“(Ctrl Z)hello回車”時,程式並沒有終止。按“Ctrl Z”和多次回車,也不終止。感覺有點兒奇怪。不過,
當按“(Ctrl Z)回車(Ctrl Z)”便可跳出迴圈。
我查了一下MSDN,摘錄如下,介紹得也不怎麼詳細。有對此種情況比較清楚的,望請解釋一下。
【The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.】
%d,遇到數字,'+','-'以外的字元結束,可跳過空格
%f,,%lf:遇到數字, '.', 'e','+','-'之外的字元結束,可跳過空格
%s,從第一個非空格字元起直到下一個空格結束.
%c,遇到字元就賦值,不管是空格還是回車之類的.
假如程式中出現這樣的程式碼,scanf("%d,%s,%c,%c).雖然程式是以 ', '作為分隔的,但%s是不認這個 ', '的,它只認空格,所以會出現變數不能正確賦值的情況,如果你將','去掉,但由於%c卻遇到空格又不會跳過,所以也不會滿足需要,通過上面的我們知道,%c遇到空格是不會跳過的,所以我採取下面這個方式來解決,在%c的前面加一個空格來處理,這樣就可以解決上面的所有問題了,所以我們在使用%c時,要在前面加上一個空格,養成這種習慣可以省去不少麻煩,並且在使用%c之前最好還加上一句fflush(stdin);用來清除快取.