我有下面的代碼,更換fflush的(標準輸入)
fflush(stdin);
print("Enter y/n");
scanf("%c",&a);
這裏,在退出之前給input.it看起來像問題,因爲它不是沖洗掉,這可能是輸入緩衝有一些垃圾字符。是否有任何替代flush(stdin)。此代碼片段在Solaris中工作,但它不在Linux中工作。
我有下面的代碼,更換fflush的(標準輸入)
fflush(stdin);
print("Enter y/n");
scanf("%c",&a);
這裏,在退出之前給input.it看起來像問題,因爲它不是沖洗掉,這可能是輸入緩衝有一些垃圾字符。是否有任何替代flush(stdin)。此代碼片段在Solaris中工作,但它不在Linux中工作。
這在C FAQ中有很好的解釋。另見:explanation。建議的解決方案:
fgets
和sscanf
使用該吃換行符
while((c = getchar()) != '\n' && c != EOF)
/* discard the character */;
該沖洗標準輸入上的一些實現is wrong工作的事實。
某些供應商實現fflush所以 是fflush(標準輸入)丟棄未讀 人物,雖然移植的程序 不能依靠這一點。
更好的第一個選項。 – 2013-01-13 00:50:21
對於C上GNU
可以使用
__fpurge(stdin);
包括stdio_ext.h頭用於訪問功能。儘管這篇文章還很舊,但我認爲這可能會幫助一些Linux開發人員。
這太可怕了,即使它按預期工作。想象一下,如果輸入來自文件或管道,會發生什麼情況。 – 2015-01-17 23:51:35
scanf(" %c",&c);
或
scanf(" ");
//reading operation (gets(), fgets(stdin,...) etc)
空間在scanf()的格式串將忽略任何空白,直到第一個非空格。
「man fflush」的第一行顯示如下:* fflush()函數對給定的**輸出或更新**流**強制**寫入所有用戶空間緩衝數據。 cnicutar對於如何跳過不需要的輸入有正確的答案,但除此之外,您應該*閱讀您正在使用的函數的文檔。 *和*檢查它們的返回值......因爲上面的調用將返回'EOF'並設置'errno = EBADF'來表示您錯誤地使用該函數。忽略返回值是壞的,壞的,壞的... – DevSolar 2011-06-08 10:57:28
參見[使用'fflush(stdin)'](http://stackoverflow.com/questions/2979209/using-fflushstdin)。 – 2016-09-15 05:31:20