2011-06-08 49 views
4

我有下面的代碼,更換fflush的(標準輸入)

fflush(stdin); 
print("Enter y/n"); 
scanf("%c",&a); 

這裏,在退出之前給input.it看起來像問題,因爲它不是沖洗掉,這可能是輸入緩衝有一些垃圾字符。是否有任何替代flush(stdin)。此代碼片段在Solaris中工作,但它不在Linux中工作。

+2

「man fflush」的第一行顯示如下:* fflush()函數對給定的**輸出或更新**流**強制**寫入所有用戶空間緩衝數據。 cnicutar對於如何跳過不需要的輸入有正確的答案,但除此之外,您應該*閱讀您正在使用的函數的文檔。 *和*檢查它們的返回值......因爲上面的調用將返回'EOF'並設置'errno = EBADF'來表示您錯誤地使用該函數。忽略返回值是壞的,壞的,壞的... – DevSolar 2011-06-08 10:57:28

+0

參見[使用'fflush(stdin)'](http://stackoverflow.com/questions/2979209/using-fflushstdin)。 – 2016-09-15 05:31:20

回答

14

這在C FAQ中有很好的解釋。另見:explanation。建議的解決方案:

  • 使用scanf退出。使用fgetssscanf
  • 使用該吃換行符

    while((c = getchar()) != '\n' && c != EOF) 
    /* discard the character */; 
    

該沖洗標準輸入上的一些實現is wrong工作的事實。

某些供應商實現fflush所以 是fflush(標準輸入)丟棄未讀 人物,雖然移植的程序 不能依靠這一點。

+0

更好的第一個選項。 – 2013-01-13 00:50:21

3

對於C上GNU

可以使用

__fpurge(stdin); 

包括stdio_ext.h頭用於訪問功能。儘管這篇文章還很舊,但我認爲這可能會幫助一些Linux開發人員。

+0

這太可怕了,即使它按預期工作。想象一下,如果輸入來自文件或管道,會發生什麼情況。 – 2015-01-17 23:51:35

2
scanf(" %c",&c); 

scanf(" "); 
//reading operation (gets(), fgets(stdin,...) etc) 

空間在scanf()的格式串將忽略任何空白,直到第一個非空格。