2013-09-27 42 views
4
#include <stdio.h> 
int main(void) 

{ 
    char F,C; 

    printf("Do you have a Fever? y/n\n"); 
    F = getchar(); 

    printf("Do you have a runny nose or cough? y/n\n"); 
    C = getchar(); 


    printf("Here are the results you input:\n"); 
    printf("Do you have a fever?"); 
    putchar(F); 

    printf("\nDo you have a runny nose or cough?"); 
    putchar(C); 

    return 0; 
} 

該代碼輸入第一個getchar();的結果,然後退出而無需等待更多輸入。這是爲什麼?無法弄清楚如何使用getchar(); in C

+3

'getchar()'返回一個'int',而不是'char'。閱讀它的文檔('man getchar'或相當的文檔)來查看原因。 –

+3

歡迎來到Stack Overflow!不像其他一些互聯網論壇,你可能知道,堆棧溢出不是一個討論網站,也不是作業幫助網站。這是一個**問題**和 - **答案**網站。諸如你自己的用戶提出問題並且其他用戶試圖回答他們。你的問題是什麼? –

回答

5

使用while循環

printf("Do you have a Fever? y/n\n"); 
F = getchar(); 
while((F = getchar()) != EOF && F != '\n') // This will eat up all other characters 
    ; 

printf("Do you have a runny nose or cough? y/n\n"); 
C = getchar(); 
while((C = getchar()) != EOF && C != '\n') 
    ; 
+0

如果用戶輸入空行,該怎麼辦?或者更糟糕的是,鍵入ctrl-D或ctrl-Z或任何關鍵字用於EOF。 –

+0

請注意,您將在使用F和C之後放置while循環,否則它們將被重新分配給循環中消耗的其他字符。 (我知道這對你的專家來說顯而易見,但是像我這樣爲n00bs添加了說明。) – user124384

+0

在'while'循環中使用除'C'或'F'之外的變量。並且,最好將這些環路分解爲一個函數。 –

7

首先,getchar()返回int,而不是char。這是因爲它可以返回任何有效的字符(對於CHAR_BIT爲8的系統,值爲0..255)和單獨的值(通常爲-1)作爲EOF。

二,當用戶鍵入答案時,信息包含字符(Y或N,你希望)加上一個換行符。有可能是領先的空白;可能會有尾隨垃圾。

所以,你的F可能會得到第一個字符; C讀取換行符,而不是等待更多輸入。

如果你想讀線並依次處理每個使用fgets()讀取線和sscanf()解析結果。或者使用一個函數來封裝類似的處理,如下面的get_answer()函數。

#include <stdio.h> 

int get_answer(void) 
{ 
    int c; 
    int answer = 0; 
    while ((c = getchar()) != EOF && c != '\n') 
    { 
     if (answer == 0 && (c == 'y' || c == 'n')) // Upper-case? 
      answer = c; 
     /* ?check for garbage here and complain? */ 
    } 
    return answer; 
} 

int main(void) 
{ 
    int F,C; 
    char line[4096]; 

    printf("Do you have a Fever? y/n\n"); 
    F = get_answer(); 

    printf("Do you have a runny nose or cough? y/n\n"); 
    C = get_answer(); 


    printf("Here are the results you input:\n"); 
    printf("Do you have a fever? %c\n", F); 
    printf("Do you have a runny nose or cough? %c\n", C); 

    return 0; 
} 

請注意,換行符通常在輸出結束時結束。您可以從提示消息中忽略它們,以便輸入與交互式會話中的提示出現在同一行。 調用代碼並未真正處理EOF - 在輸入任何數據之前,這些使用會觸發EOF條件(例如,通過輸入Control-D)。 get_answer()中的代碼是可以的; main()中的代碼應測試零回報。如果你想只處理一個字符,每getchar()

1

這是因爲當你按下Enter鍵,回答第一個問題後,回車鍵被保存到下一個變量C. 要糾正它,只需編寫另一個getchar來消化額外的Enter。

它應該是: -

#include <stdio.h> 
int main(void) 

{ 
char F,C; 

printf("Do you have a Fever? y/n\n"); 
F = getchar(); 

getchar(); /* takes the enter key */ 

printf("Do you have a runny nose or cough? y/n\n"); 
C = getchar(); 

getchar(); /* takes the enter key */ 

printf("Here are the results you input:\n"); 
printf("Do you have a fever?"); 
putchar(F); 

printf("\nDo you have a runny nose or cough?"); 
putchar(C); 

return 0; 
} 
0

當你輸入一個字符,它被保存在F,則當你按下回車鍵,存儲在標準輸入緩衝區,接下來的getchar()來讀取它的從標準輸入緩衝區輸入,爲此在每次使用getchar()之前使用fflush(stdin)。