1. 程式人生 > >getchar()和scanf("%c",ch)在用EOF判斷結束時的區別

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值

。比如:輸入“hello(Ctrl Z)回車”,程式並不會終止,因為(Ctrl Z)並不位於第一位置;當輸入“(Ctrl Z)hello回車”時,迴圈即可跳出。

【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);用來清除快取.