无法弄清楚如何使用getchar(); 在C.

use*_*931 5 c getchar

#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();然后退出而不等待更多输入.这是为什么?

Jon*_*ler 9

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


hac*_*cks 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')
    ;
Run Code Online (Sandbox Code Playgroud)