首先,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!不像其他一些互联网论坛,你可能知道,堆栈溢出不是一个讨论网站,也不是作业帮助网站。这是一个**问题**和 - **答案**网站。诸如你自己的用户提出问题并且其他用户试图回答他们。你的问题是什么? –