首先,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()
後
'getchar()'返回一個'int',而不是'char'。閱讀它的文檔('man getchar'或相當的文檔)來查看原因。 –
歡迎來到Stack Overflow!不像其他一些互聯網論壇,你可能知道,堆棧溢出不是一個討論網站,也不是作業幫助網站。這是一個**問題**和 - **答案**網站。諸如你自己的用戶提出問題並且其他用戶試圖回答他們。你的問題是什麼? –