#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;
}
Run Code Online (Sandbox Code Playgroud)
代码从第一个输出结果getchar();然后退出而不等待更多输入.这是为什么?
首先,getchar()返回一个int,而不是一个char.这样它可以返回任何有效字符(对于CHAR_BIT为8的系统,值为0..255),并且单独的值(通常为-1)为EOF.
其次,当用户键入答案时,信息包含字符(Y或N,您希望)加上换行符.可能有领先的空白; 可能会有垃圾.
所以,你的F可能会得到第一个角色; C读取换行符,而不是等待更多输入.
如果要读取行并依次处理每行,请使用fgets()读取行并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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,一般而言,换行符位于输出的末尾.您可以从提示消息中省略它们,以便输入与交互式会话中的提示出现在同一行.调用代码并没有真正正确地处理EOF - Control-D在输入任何数据之前,使用触发EOF条件(例如通过键入).代码输入get_answer()正常; 代码main()应该测试零回报.
如果只想处理一个字符,请while在每个循环后使用一个循环getchar()
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')
;
Run Code Online (Sandbox Code Playgroud)