首先,getchar() 返回一個 int,而不是 char 。 這樣它就可以返回任何有效字元( 值為 0的值。CHAR_BIT為 8的系統 255 ) 和一個單獨的值( 通常 -1 ) 作為 eof 。
其次,當用戶鍵入答案時,信息包含字元( 你也希望) 和換行符。 可能有前導空格;可能有尾部垃圾。
因此,你的F 可能得到第一個字元;C 讀取換行,而不是等待更多的輸入。
如果要依次讀取行和進程,請使用 fgets() 讀取行和 sscanf() 以解析結果。 或者使用函數封裝類似的處理,如下面的get_answer() 函數。#include
extern int get_answer(void);/* Declare in a header? */
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;
printf("Do you have a Fever? y/nn");
F = get_answer();
printf("Do you have a runny nose or cough? y/nn");
C = get_answer();
printf("Here are the results you input:n");
printf("Do you have a fever? %cn", F);
printf("Do you have a runny nose or cough? %cn", C);
return 0;
}
注意,換行在輸出結束時,一般情況下。 可以從提示消息中省略它們,以便輸入與交互會話中的提示符出現在同一行中。 在輸入任何數據時,調用代碼並不真正處理 eof 正確的—,它的中用戶觸發 eof 條件( 通過鍵入控制項d 例如) 。 get_answer() 中的代碼是可以的;main() 中的代碼應該測試零返回。