2014-10-19 42 views
1

對於這個愚蠢的問題,我很抱歉。我有C程序提示用戶輸入年齡和姓名,然後將年齡和姓名打印到屏幕上。這是我從書中讀取的練習。fflush()函數不能使用stdin

此程序:

#include <stdio.h> 

int main (void) { 
    int age; 
    char name[20]; 

    puts("Enter your age:"); 
    scanf("%d",&age); 

    fflush(stdin); 

    puts("Enter your name:"); 
    scanf("%s",name); 

    printf("Your age is %d\n",age); 
    printf("Your name is %s\n",name); 

    return 0; 
} 

當我輸入額外的字符到第一scanf()程序終止,並分配多餘的字符到下一個scanf()

然後,我改變了代碼,並添加功能命名爲clear_buff()並使用clear_buff()中的fgets函數讀取碼流中剩餘的字符。該代碼按我的預期工作。

#include <stdio.h> 

#define MAXLEN 80 

void clear_buff(void); 

int main (void) { 
    int age; 
    char name[20]; 

    puts("Enter your age:"); 
    scanf("%d",&age); 

    clear_buff(); 

    puts("Enter your name:"); 
    scanf("%s",name); 

    printf("Your age is %d\n",age); 
    printf("Your name is %s\n",name); 

    return 0; 
} 

void clear_buff(void){ 
    char junk[20]; 
    fgets(junk,MAXLEN,stdin); 
} 

我的問題是爲什麼fflush(stdin)不能在此程序中工作?

該書說fflush函數清除流中的任何緩衝數據。而且我知道 fflush()函數是C標準函數,如果使用I/O流。

+0

嘗試'fflush(stdout)'。 – 2014-10-19 01:27:12

+0

'fflush'用於清除輸出。 [見這裏](http://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c)瞭解如何清除輸入。 – 2014-10-19 01:29:14

+0

輸入流(如stdin)上的'fflush'具有未定義的行爲。 – 2014-10-19 01:33:55

回答

7

fflush是指具有輸出或更新流的工作,並用它與輸入流是未定義的行爲,從cppreference C型鋼爲fflush

的行爲是不確定如果給定的流是輸入的類型或給定流是否爲更新類型,但最後的I/O操作不是輸出操作。

undefined behavior是行爲標準沒有規定,這意味着你的程序的結果是不可預知的,這可能意味着行爲似乎正常或者崩潰或其他不良影響。

cppreference是選秀C99標準節7.19.5.2fflush函數它說的語言是一致的:

如果流點到輸出流或其中 最近一次操作是一個更新流未輸入,fflush函數會將該流的任何未寫入數據傳遞到主機環境 以寫入文件;否則,行爲是不確定的。

雖然這不是真的你的問題,好像你已經找到了一個變通,問題C, flushing stdin佔地面積沖洗stdin的一些適當的方法。

+0

你能向我解釋什麼是'如果給定的流是輸入類型,或者如果給定的流是更新類型,但最後的I/O操作不是輸出操作,我很抱歉,我剛剛開始學習C,我試圖理解那個陳述,但仍然不明白。 – harianja 2014-10-19 01:53:13

+0

@harianja我添加了一些關於未定義行爲的更多細節。如果你指的是輸入,輸出和更新流之間的差異,那麼這將打開一個閱讀,寫作或閱讀和寫作流。有關不同的模式,請參見[fopen](http://en.cppreference.com/w/cpp/io/c/fopen)。 – 2014-10-19 02:22:47

相關問題