Intereting Posts
одновременных читателей и взаимно исключая авторов в C, используя pthreads Существует ли значимое различие между автономными и размещенными реализациями? Программа, использующая Semaphores, отлично работает в Linux … неожиданные результаты на Mac osX Opengl, нарисовавший 2d-оверлей по проблеме 3d-сцены Что значит «присоединиться» к streamу? Какие соглашения об именах вы используете с функциями, которые выделяют память? Добавление каталога include в gcc * before * -I Невозможно удалить гласные из одиночного списка Ошибка переполнения стека, выполняющая магический квадрат. Любое возможное решение? Использование ввода / вывода файла для чтения длины байта Различная инициализация строк дает другое поведение? Почему элемент управления входит в «еще»? Разбиение массива C char на слова Функция сжатия K & R Exercise C – преобразовать time_t в строку с форматом ГГГГ-ММ-ДД ЧЧ: ММ: СС

Не могу понять, как использовать getchar (); в C

#include  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(); а затем выходит, не дожидаясь большего ввода. Это почему?

Используйте цикл 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') ; 

Во-первых, getchar() возвращает int , а не char . Это значит, что он может вернуть любой допустимый символ (как значение 0..255 для систем, где CHAR_BIT равно 8) и отдельное значение (обычно -1) как EOF.

Во-вторых, когда пользователи набирают ответ, информация содержит символ (надеюсь, что Y или N) плюс новая строка. Там могут быть ведущие пробелы; может быть хвост мусора.

Итак, ваш F, вероятно, получит первого персонажа; C читает новую строку, не дожидаясь большего ввода.

Если вы хотите читать строки и обрабатывать их поочередно, используйте fgets() чтобы прочитать строку и sscanf() чтобы проанализировать результат. Или используйте функцию для инкапсуляции подобной обработки, например, функцию get_answer() ниже.

 #include  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 должным образом – там, где использование запускает условие EOF (например, набрав Control-D ), прежде чем вводить какие-либо данные. Код в get_answer() в порядке; код в main() должен проверить нулевой возврат.

Это потому что, когда вы нажимаете Enter, после ответа на первый вопрос, ключ ввода сохраняется в следующей переменной C. Чтобы исправить это, просто напишите еще один getchar, чтобы съесть дополнительный Enter.

Так должно быть :-

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

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