1. 程式人生 > >C語言清空輸入緩衝區

C語言清空輸入緩衝區

先來看一段程式碼:

#include <stdio.h>
int main()
{
	int num;
	char ch ;
	scanf("%d", &num);
	scanf("%c", &ch);
	printf("hello world\n");
	system("pause");
	return 0;
}


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

1

a

hello world

但事實是下面的樣子

1

hello world

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

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

\n’。

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

下面是幾種解決辦法:

①解決辦法一

#include <stdio.h>
int main()
{
	int num;
	char ch ;
	scanf("%d", &num);
	setbuf(stdin, NULL);//使stdin輸入流由預設緩衝區轉為無緩衝區
	scanf("%c", &ch);
	printf("hello world\n");
	system("pause");
	return 0;
}


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

#include <stdio.h>
int main()
{
	int num;
	char ch ;
	scanf("%d", &num);
	while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()獲取緩衝中字元,直到獲取的c是“\n”或檔案結尾符EOF為止
	scanf("%c", &ch);
	printf("hello world\n");
	system("pause");
	return 0;
}


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