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後一...