清空輸入緩衝 與 fflush

2021-04-23 10:00:54 字數 2821 閱讀 6297

1.

為什麼

fflush(stdin)

是錯的首先請看以下程式:

#include<stdio.h>

int main( void )

return 0; }

這個程式首先會提示使用者輸入乙個整數,然後等待使用者輸入,如果使用者輸入的是整數,程式會輸出剛才輸入的整數,並且再次提示使用者輸入乙個整數,然後等待使用者輸入。但是一旦使用者輸入的不是整數(如小數或者字母),假設scanf

函式最後一次得到的整數是

2 ,那麼程式會不停地輸出「

please input an integer: 2

」。這是因為scanf("%d", &i);

只能接受整數,如果使用者輸入了字母,則這個字母會遺留在「輸入緩衝區」中。因為緩衝中有資料,故而scanf

函式不會等待使用者輸入,直接就去緩衝中讀取,可是緩衝中的卻是字母,這個字母再次被遺留在緩衝中,如此反覆,從而導致不停地輸出「

please input an integer: 2

」。也許有人會說:「居然這樣,那麼在

scanf

函式後面加上『

fflush(stdin);

』,把輸入緩衝清空掉不就行了?」然而這是錯的!c

c++

標準裡從來沒有定義過

fflush(stdin)

。也許有人會說:「可是我用

fflush(stdin)

解決了這個問題,你怎麼能說是錯的呢?」的確,某些編譯器(如vc6

)支援用

fflush(stdin)

來清空輸入緩衝,但是並非所有編譯器都要支援這個功能(gcc3.2

不支援),因為標準中根本沒有定義

fflush(stdin)

msdn

文件裡也清楚地寫著

fflush on input stream is anextensionto the c standard

(fflush

操作輸入流是對

c 標準的擴充)。當然,如果你毫不在乎程式的移植性,用

fflush(stdin)

也沒什麼大問題。以下是c99

fflush

函式的定義:

int fflush(file*stream);

如果stream指向輸出流或者更新流

update stream),並且這個更新流

最近執行的操作不是輸入,那麼fflush函式將把任何未被寫入的資料寫入

stream

指向的檔案(如標準輸出檔案stdout)。否則,fflush函式的行為是不確定的。

fflush(null)清空所有輸出流和上面提到的更新流。如果發生寫錯誤,fflush

函式會給那些流打上錯誤標記,並且返回eof,否則返回0。

由此可知,如果

stream

指向輸入流(如

stdin

),那麼

fflush

函式的行為是不確定的。故而使用

fflush(stdin)

是不正確的,至少是移植性不好的。

2.

清空輸入緩衝區的方法

雖然不可以用

fflush(stdin)

,但是我們可以自己寫**來清空輸入緩衝區。只需要在

scanf

函式後面加上幾句簡單的**就可以了。

/*c

版本*/

#include<stdio.h>

int main( void )

/* end of while */}

printf("%d/n", i);}

return 0; }

/*c++

版本*/

#include<iostream>

#include<limits>//

為了使用

numeric_limits

using std::cout;

using std::endl;

using std::cin;

int main( )

return 0;

}參考資料

清空輸入緩衝區

清空輸入緩衝區 cin.clear 清除錯誤標記,比如要求輸入int型,但我們輸入了char型,就會導致輸入錯誤,產生錯誤標記 cin.sync 清空輸入緩衝區 cin.ignore n,ch 第乙個引數是清空輸入緩衝區的大小,第二個引數是終止字元 注 終止字元也會被丟棄 常用形式有以下兩種 cin...

Linux程式設計 清空標準輸入緩衝區

linux程式設計的時候需要清空標準輸入緩衝區,於是使用了如下windows程式設計中的方法 1.fflush stdin 這個fflush 函式根本不是標準c中的函式,只是標準c的擴充套件,所以在linux中使用根本不行 2.中網上搜尋了下,發現有建議使用rewind stdin 這個函式其實是將...

Linux下如何清空輸入緩衝區

今天在linux下編寫資料結構課程的乙個旅遊管理程式時,遇到了一些有關鍵盤輸入緩衝區的問題。使用scanf函式進行等待使用者輸入時,使用者輸入完會在緩衝區裡遺留乙個換行符 n 如果不清除掉這個換行符,就會在下一次的scanf中被作為輸入,直接跳過,不會等待使用者的輸入,所以,一般在呼叫scanf後一...