2016-03-02 14 views
1

我感到困惑如何scanf的和的getchar手柄流不同,下面是一個示例代碼:scanf和getchar處理流的方式不同嗎?

while(scanf("%d", &input) != 1) 
{ 
    while((ch = getchar()) != '\n') 
    { 
     putchar(ch); 
    } 
    printf("\nThis is wrong\n"); 
} 

printf("That is right\n"); 

它是用於測試是否輸入是整數一個簡單的程序。內部while循環用於在單擊Enter之前顯示每個錯誤的輸入值。當我輸入一個隨機字符串如:

qwert 

putchar將打印出確切的字符串。但是,如果我換成

while(scanf("%d", &input) != 1) 

while((ch = getchar()) != '\n') 

,並打印出完全相同的字符串,第一個字母「Q」被退學了。 所以我的問題是如何scanf和getchar在外部循環處理這種情況不同?

+2

外環中的'getchar'吃掉了'q'。在內部循環之前添加'putchar(ch)'來解決問題。另一方面,對於無效輸入(例如字符),'scanf(「%d」)'將失敗,並返回0,並將字符(無效輸入)留在stdin中。 –

回答

6

當您使用scanf嘗試讀取一個整數,你給一些輸入是一個整數,然後scanf將失敗,並不會返回1。然而,它會保持輸入完整,它不會從輸入中提取任何內容,只會讓內部循環消化和打印。

如果您在外環使用getchar,它實際上將消耗一個字符,不管它是什麼字符,然後內循環就不會看到這個角色,因爲它不輸入緩衝區存在了。

相關問題