Не могу понять, как использовать 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;
}

Код вводит результаты сначала getchar();, а затем завершает работу, не дожидаясь дальнейших вводов. Это почему?


person user2824931    schedule 27.09.2013    source источник
comment
getchar() возвращает int, а не char. Прочтите его документацию (man getchar или аналогичную), чтобы понять почему.   -  person Keith Thompson    schedule 28.09.2013
comment
Добро пожаловать в Stack Overflow! В отличие от некоторых других интернет-форумов, которые вы, возможно, знаете, Stack Overflow не является ни дискуссионным сайтом, ни сайтом помощи в выполнении домашних заданий. Это сайт вопросов и ответов. Такие пользователи, как вы, задают вопросы, а другие пользователи пытаются на них ответить. Какой у Вас вопрос?   -  person Robᵩ    schedule 28.09.2013


Ответы (4)


Используйте цикл 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')
    ;
person haccks    schedule 27.09.2013
comment
А что, если пользователь введет пустую строку? Или, что еще хуже, введите ctrl-D или ctrl-Z или любую другую клавишу для EOF. - person Jim Balter; 28.09.2013
comment
Обратите внимание, что вы захотите поместить циклы while после использования F и C, иначе они будут переназначены другим символам, которые они поглощают в циклах. (Я знаю, что это очевидно для вас, экспертов, но я добавлю пояснение для таких нубов, как я.) - person user124384; 22.07.2015
comment
Используйте переменную, отличную от C или F в циклах while. И, желательно, превратить циклы в функцию. - person Jonathan Leffler; 14.08.2015
comment
Использование && вместо & здесь более идиоматично. - person chux - Reinstate Monica; 06.01.2016

Во-первых, getchar() возвращает int, а не char. Это сделано для того, чтобы он мог возвращать любой допустимый символ (в виде значения 0..255 для систем, где CHAR_BIT равен 8) и отдельное значение (обычно -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;
}

Обратите внимание, что новые строки обычно идут в конце выходных данных. Вы можете опустить их из подсказок, чтобы ввод отображался в той же строке, что и подсказка в интерактивном сеансе. Вызывающий код на самом деле не обрабатывает EOF должным образом — где use запускает условие EOF (например, нажимая Control-D) перед вводом каких-либо данных. Код в get_answer() в порядке; код в main() должен проверять нулевой возврат.

person Jonathan Leffler    schedule 27.09.2013
comment
Отличный ответ! - person Peter Martinson; 15.04.2018

Это потому, что когда вы нажимаете 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;
}
person Abhishek    schedule 24.11.2014

Когда вы вводите символ, он сохраняется в F, затем, когда вы нажимаете ввод, он сохраняется в буфере stdin, а когда приходит следующий getchar(), он считывает его ввод из буфера stdin, для этого используйте fflush (stdin) перед каждым getchar () ты используешь.

person arvind    schedule 15.06.2015