首先,getchar()
返回一个int
,而不是一个char
。这样它就可以返回任何有效字符(对于 CHAR_BIT 为 8 的系统,作为值 0..255)和作为 EOF 的单独值(通常为 -1)。
其次,当用户输入答案时,信息包含字符(你希望是 Y 或 N)加上换行符。可能有前导空格;可能有尾随垃圾。
所以,你的 F 可能是第一个字符;C 读取换行符,而不是等待更多输入。
如果要读取行并依次处理每行,请使用fgets()
to 读取行并sscanf()
解析结果。或者用一个函数来封装类似的处理,比如get_answer()
下面这个函数。
#include <stdio.h>
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/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——Control-D在输入任何数据之前,用户会触发 EOF 条件(例如通过键入)。里面的代码get_answer()
没问题;中的代码main()
应该测试零回报。