2 回答

TA貢獻1805條經驗 獲得超9個贊
這要看你輸入什么了。有一個要點:scanf()的返回值是它成功讀入值的個數。如果你第一次輸入一個整數,那么第一個scanf函數會成功讀入一個整數,它的返回值就是1,即ret的值是1。那么for循環的關系表達式:ret!=1就不成立,整個循環就不會執行,程序直接停止。如果你第一次輸入了非整數,那么第一個scanf函數成功讀入的值就是0,它返回0,即ret = 0。此時for循環的關系表達式:ret!=1成立,for循環才會開始迭代。如果你的程序執行的時候一直在打印,不給你輸入的機會,說明你清空輸入緩沖區的函數fflush沒起作用,緩沖區里保存的第一次非法輸入一直都在。你把 fflush(stdin); 改成: while(getchar()!='\n'); 就好了。

TA貢獻1966條經驗 獲得超4個贊
fflush() ;
清除標準輸入緩存。
函數名: fflush
功 能: 清除文件緩沖區,文件以寫方式打開時將緩沖區內容寫入文件
原型:int fflush(FILE *stream)
程序例:
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>
void flush(FILE *stream);
int main(void)
{
FILE *stream;
char msg[] = "This is a test";
/* create a file */
stream = fopen("DUMMY.FIL", "w");
/* write some data to the file */
fwrite(msg, strlen(msg), 1, stream);
clrscr();
printf("Press any key to flush DUMMY.FIL:");
getch();
/* flush the data to DUMMY.FIL without\
closing it */
flush(stream);
printf("\nFile was flushed, Press any key\
to quit:");
getch();
return 0;
}
void flush(FILE *stream)
{
int duphandle;
/* flush the stream's internal buffer */
fflush(stream);
/* make a duplicate file handle */
duphandle = dup(fileno(stream));
/* close the duplicate handle to flush the DOS buffer */
close(duphandle);
}
fflush 的返回值類型是int類型,那么這個int類型具體的返回是什么呢?
返回值:
如果成功刷新,fflush返回0。指定的流沒有緩沖區或者只讀打開時也返回0值。返回EOF指出一個錯誤。
注意:如果fflush返回EOF,數據可能由于寫錯誤已經丟失。當設置一個重要錯誤處理器時,最安全的是用setvbuf函數關閉緩沖或者使用低級I/0例程,如open、close和write來代替流I/O函數。
fflush()函數
fflush(stdin)刷新標準輸入緩沖區,把輸入緩沖區里的東西丟棄
fflush(stdout)刷新標準輸出緩沖區,把輸出緩沖區里的東西打印到標準輸出設備上
注意事項:
C和C++的標準里從來沒有定義過 fflush(stdin)。也許有人會說:“可是我用 fflush(stdin) 解決了這個問題,你怎么能說是錯的呢?”的確,某些編譯器(如VC6)支持用 fflush(stdin) 來清空輸入緩沖,但是并非所有編譯器都要支持這個功能(linux 下的 gcc 就不支持),因為標準中根本沒有定義 fflush(stdin)。
添加回答
舉報