2013-08-25 126 views
2

這可能是一個簡單的問題,但我搜索了很多,但仍然沒有弄明白。 我用gcc編譯下面的snip代碼並從終端運行程序。正確的,它允許輸入一個int和一個字符,但它不會。它不會等待輸入char?scanf()函數不起作用?

這裏的任何人都可以幫助我,會友善的。提前致謝!

#include <stdio.h> 

int main() 
{ 

    char c; 
    int i; 

    // a 
    printf("i: "); 
    fflush(stdin); scanf("%d", &i); 

    // b 
    printf("c: "); 
    fflush(stdin); scanf("%c", &c); 

    return 0; 

}

+3

'fflush(stdin)'給你不確定的行爲,不要這樣做。 –

+0

你是否給它一個輸入鍵以及輸入? –

+1

fflush未在輸入流中定義。太糟糕了一些C書實際上鼓勵它。 – Kunal

回答

2

可以使用getchar()達到你想要的東西。

或使用消耗額外的換行符: -

scanf(" %c", &c); 
    ^^^ <------------Note the space 

原因: - 你的下一個scanf函數讀取字符只是讀取/消耗換行,因此從不等待用戶輸入

+0

替換'scanf(「%c」,&c);'''c = getchar();'顯示同樣的行爲 – icktoofay

+0

我知道,但我想弄清楚它在這種情況下不起作用。 ,當我更改順序// a和// b時,它會起作用 – dangnam2910

+0

您的下一個閱讀字符的scanf只讀取/消耗換行符,因此永遠不會等待用戶輸入 –

6

%d會讀連續的數字,直到它遇到非數字。 %c讀取一個字符。可能發生的是你給它一個數字(幾位數字),然後是一個新行。 %c然後讀入該新行。您可能希望fflush(stdin);放棄任何尚未閱讀的內容,但不幸的是,該內容爲that's undefined behavior

的解決方案是讀取字符前放棄所有空白:

scanf(" %c", &c); 

注意在開始的空間。這意味着放棄所有空白。

+0

這正是我所做的:輸入一個數字,然後是一個新的行,它現在可以工作!非常感謝! – dangnam2910

2

代替fflush(stdin); scanf("%c", &c);

1.使用scanf的與額外的空間

scanf(" %c",&c); 

2.使用的getchar()兩次,第一次讀取 '\ n',該輸入後給整數輸入和第二次打電話要求你輸入爲c:

getchar(); 
c=getchar(); 

會幫助你。

1

首先,按照說明使用scanf。我認爲下面的代碼做你想要的。刷新Stdout,以便提示用戶輸入整數或字符。使用%1s允許像\ n那樣的空白區域。

int main() 
{ 

    char c[2]; 
    int i; 

    printf("i: "); 
    fflush(stdout); 
    scanf("%d", &i); 

    printf("c: "); 
    fflush(stdout); 
    scanf("%1s", &c); 

    printf("\ni = %d, c = %c", i, c[0]); 

    return 0; 

} 

此代碼已在Eclipse/Microsoft C編譯器上測試/運行。

0

fflush()不保證做任何事情,而gcc/g ++不會。無論如何,不​​在Linux上。

我以爲我發明了以下方法來刷新行的其餘部分......直到我在ISO C規範中看到它作爲示例(90或99 ...忘記了它,但它已經存在了很長時間無論哪種方式...我敢打賭,這裏的大多數讀者已經看到它。)

scanf(「%* [^ \ n]%c」);/丟棄一切直至包括下一個換行符*/

你可以把它放在你自己的「flush」函數中,以保存鍵入或粘貼遍佈整個地方。

您應該仍然按照建議在scanf中放置一個空格(「%c」,& c);

如果在前導空格或輸入鍵的雙擊中,耐心等待非空白字符。