C語言清空輸入緩沖區


來源:http://blog.csdn.net/guanyasu/article/details/53153705

https://zhidao.baidu.com/question/5241738.html

 

C語言中如何清空輸入輸出緩沖區

 上述描述似乎能夠解決問題了,但是,fflush( )並不是標准C語言庫函數,只是部分編譯器自己實現的函數,是對標准C的擴展。

 

 先來看一段代碼: 

 1 #include <stdio.h>  
 2 int main()  
 3 {  
 4     int num;  
 5     char ch ;  
 6     scanf("%d", &num);  
 7     scanf("%c", &ch);  
 8     printf("hello world\n");  
 9     system("pause");  
10     return 0;  
11 }  

設想輸入一個數字和一個字母,應該出現如下情況

1

a

hello world

但事實是下面的樣子

1

hello world

-----------------------------

原因是:在輸入回車(‘\n’)時,相當於輸入了一個字符,這樣緩沖區內就殘留了一個‘\n’。

 

再有就是我們使用scanf("%c", &ch);在中斷接受一個字符,但若用戶輸入好幾個字符,那么ch將只接受一個,而這時大量字符滯留在緩沖區內,下次再調用scanf時,還沒有輸入東西,緩沖區內的內容直接傳到了scanf內,這樣就造成了嚴重的錯誤。

下面是幾種解決辦法:

①解決辦法一

 使用setbuf(stdin,null);可以使stdin輸入流由默認緩沖區轉為無緩沖區,這樣scanf輸入完畢后,緩沖區內的東西就消失了。

 1 #include <stdio.h>  
 2 int main()  
 3 {  
 4     int num;  
 5     char ch ;  
 6     scanf("%d", &num);  
 7     setbuf(stdin, NULL);//使stdin輸入流由默認緩沖區轉為無緩沖區  
 8     scanf("%c", &ch);  
 9     printf("hello world\n");  
10     system("pause");  
11     return 0;  
12 }  

②解決方法二

 1 #include <stdio.h>  
 2 int main()  
 3 {  
 4     int num;  
 5     char ch ;  
 6     scanf("%d", &num);  
 7     while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()獲取緩沖中字符,直到獲取的c是“\n”或文件結尾符EOF為止  
 8     scanf("%c", &ch);  
 9     printf("hello world\n");  
10     system("pause");  
11     return 0;  
12 }  

使用getchar不斷獲取緩沖區內的內容,直到緩沖區內空為止,這種方法很有效,建議使用,C primer 上也介紹了這種方法。

 

注意:有很多人可能覺得使用fflush(stdin);不就能清空緩沖區了,但使用這種方法有很多不確定性。

網上查了原因:C和C++的標准里從來沒有定義過 fflush(stdin)。
某些編譯器(如VC6)支持用 fflush(stdin) 來清空輸入緩沖,
但是並非所有編譯器都要支持這個功能(Linux 下的 gcc 就不支持),//親測確實如此在linux的gcc下不能清空緩沖區
因為標准中根本沒有定義 fflush(stdin)。

MSDN 文檔里 也清楚地寫着
fflush on input stream is an extension to the C standard(fflush 操作輸入流是對 C 標准的擴充)。
當然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也沒什么大問題。

所以大家最好不要使用fflush,移植性不好,反正上面的方法也不煩。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM