來源: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,移植性不好,反正上面的方法也不煩。