Во-первых, 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
getchar()
возвращаетint
, а неchar
. Прочтите его документацию (man getchar
или аналогичную), чтобы понять почему. - person Keith Thompson   schedule 28.09.2013