C語言:清空鍵盤緩衝區(使用scanf(),getchar()函數必讀)

 清空鍵盤緩衝區很多種方法,如用fflush(stdin); rewind(stdin);setbuf(stdin, NULL);前兩者僅對windows有用,最後一個則對Linux系統也適用。那麼爲什麼需要清空鍵盤緩衝區呢?

以下幾個實例:

Sample one

01 #include <stdio.h>
02
03 int main(void)
04 {
05 char ch1;
06 char ch2;
07
08 ch1 = getchar();
09 ch2 = getchar();
10 printf("%d %d", ch1, ch2);
11 return 0;
12 }

程序的本意很簡單,就是從鍵盤讀入兩個字符,然後打印出這兩個字符的ASCII碼值。可是執行程序後會發現出了問題:當從鍵盤輸入一個字符後,就打印出了結果,根本就沒有輸入第二個字符程序就結束了。例如用戶輸入字符’a', 打印結果是97,10。這是爲什麼呢?

【分析】:

scanf()和getchar()函數是從輸入流緩衝區中讀取值的,而並非從鍵盤(也就是終端)緩衝區讀取。而讀取時遇到回車(n)而結束的,這個n會一起讀入輸入流緩衝區的,所以第一次接受輸入時取走字符後會留下字符n,這樣第二次的讀入函數直接從緩衝區中把n取走了,顯然讀取成功了,所以不會再從終端讀取!其實這裏的10恰好是回車符!這就是爲什麼這個程序只執行了一次輸入操作就結束的原因!

【解決辦法】:

清空緩衝區的殘留數據。

使用 fflush(stdin); 或 rewind(stdin); 均可起到清空鍵盤緩衝區的作用,這兩個函數均包含在stdio.h這個頭文件中

修正後的寫法:
Sample two

01  
05
06 #include <stdio.h>
07
08 int main()
09 {
10 char ch1;
11 char ch2;
12
13 scanf("%c", &ch1);
14 printf("ch1 = %d", ch1);
15
16 fflush(stdin);
17
18 scanf("%c", &ch2);
19 printf("ch2 = %d", ch2);
20 return 0;
21 }

上面的實例只適用於Windows系統,在Linux環境下上面兩種寫法都是不起作用的,所以還要換個函數。

Sample three

01  
07
08 #include <stdio.h>
09
10 int main()
11 {
12 char ch1;
13 char ch2;
14
15 scanf("%c", &ch1);
16 printf("ch1 = %d", ch1);
17
18 setbuf(stdin, NULL); 
19
20 scanf("%c", &ch2);
21 printf("ch2 = %d", ch2);
22 return 0;
23 }
發佈了4 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章