6
#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;
}

代码首先输入结果getchar();,然后退出,无需等待更多输入。这是为什么?

4

4 回答 4

11

首先,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()应该测试零回报。

于 2013-09-27T20:45:57.303 回答
6

如果您只想处理一个字符,请在每个之后使用一个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')
    ;
于 2013-09-27T20:46:17.247 回答
3

这是因为当您按下 Enter 键时,在回答完第一个问题后,Enter 键会存储在下一个变量 C 中。要更正它,只需编写另一个 getchar 来吃掉额外的 Enter 键。

它应该是 :-

#include <stdio.h>
int main(void)

{
char F,C;

printf("Do you have a Fever? y/n\n");
F = getchar();

getchar(); /* takes the enter key */

printf("Do you have a runny nose or cough? y/n\n");
C = getchar();

getchar(); /* takes the enter key */

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;
}
于 2014-11-24T13:38:07.470 回答
2

当您输入一个字符时,它存储在 F 中,然后当您按 Enter 时,它存储在 stdin 缓冲区中,当下一个 getchar() 到来时,它从 stdin 缓冲区读取它的输入,为此在每个 getchar 之前使用 fflush(stdin) () 你用。

于 2015-06-15T14:43:32.610 回答