程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言編程—清空鍵盤緩沖區,Linux和Windows下完美實現

C語言編程—清空鍵盤緩沖區,Linux和Windows下完美實現

編輯:關於C語言
 

清空鍵盤緩沖區很多種方法,如用fflush(stdin); rewind(stdin);等,但是在linux這些都不起作用,還得我今天試了半天都沒成功,上網搜了一下發現setbuf(stdin, NULL);就能直接清空鍵盤緩沖區了。

以下幾個實例:

Sample one

#include <stdio.h>

int main()
{
char ch1;
char ch2;

ch1 = getchar();
ch2 = getchar();
printf("%d %d", ch1, ch2);
return 0;
}


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

【分析】:

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

【解決辦法】:

清空緩沖區的殘留數據。

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

修正後的寫法:
Sample two

/*
* 本程序只適用於 Windows 系統,測試平台:
* Windows XP,Microsoft Visual C++ 6.0 SP6
*/

#include <stdio.h>

int main()
{
char ch1;
char ch2;

scanf("%c", &ch1);
printf("ch1 = %d", ch1);

fflush(stdin); /*清空緩沖區,也可以使用rewind(stdin);*/

scanf("%c", &ch2);
printf("ch2 = %d", ch2);
return 0;
}


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

Sample three

/*
* 本程序適用於 Windows 和 Linux 系統,
* 測試環境:
* Windows XP,Microsoft Visual C++ 6.0 SP6
* Ubuntu Linux 8.04, NetBeans IDE 6.7
*/

#include <stdio.h>

int main()
{
char ch1;
char ch2;

scanf("%c", &ch1);
printf("ch1 = %d", ch1);

setbuf(stdin, NULL); /*清空緩沖區*/

scanf("%c", &ch2);
printf("ch2 = %d", ch2);
return 0;
}

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved