C - пытается прочитать один символ из стандартного ввода (и не удается) w / scanf / getchar

c scanf

17504 просмотра

4 ответа

как часть домашнего задания, я пытаюсь прочитать один символ из стандартного ввода и действовать в соответствии с ним:

char choice;

while (1) {
    printf("please enter [y]es, [n]o or [m]aybe: ");
    scanf("%c", choice);
    fflush(stdin);
    // validate input
    if (choice == 'y' || choice == 'n' || choice == 'm') {
        break;
    } else {
      printf("Please enter only \'y\', \'n\' or \'m\'!\n");
    }
}
// do something with the input
if (choice == 'y') {
    printf("you selected yes!\n");
}

По какой-то причине, scanf захватывает как символ, так и перевод строки после этого, поэтому он продолжает что-то делать со входом и затем выводит «Пожалуйста, введите только« y »,« n »или« m »!» линия. Если я введу несколько символов в stdin, он напечатает эту строку для всех из них, а также будет работать правильно для первого символа. Так, например:

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
$ ./run
please enter [y]es, [n]o or [m]aybe: yes<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
$

То же самое происходит, если я использую getchar. Что мне не хватает? Благодарю.

Автор: sa125 Источник Размещён: 12.11.2019 09:23

Ответы (4)


9 плюса

Решение

Вам нужен пробел между scanf("и %cдля того, чтобы он работал правильно:

scanf(" %c", &choice);

И вам также нужно использовать & выбор, а не выбор!

РЕДАКТИРОВАТЬ: В то время как вы на это, вы можете посмотреть на do while()этот цикл (если профессор специально сказал, чтобы использовать break) - do whileотлично работает при проверке пользовательского ввода!

Автор: Alex Marcotte Размещён: 24.12.2009 06:08

4 плюса

fflush () не определяется ISO для входных потоков. Он определен в библиотеке времени выполнения Microsoft C, но не является переносимым.

Хотя решение «пробел до% c» может работать, когда пользователь вводит ожидаемые данные, оно во многих отношениях завершится сбоем; попробуйте ввести "yny n", например. Консольный ввод ориентирован на лин; Лучше всего, чтобы вы сбрасывали всю линию таким образом:

scanf( "%c", choice ) ;
while( choice != '\n' && getchar() != '\n' ) /* do nothing*/ ;
Автор: Clifford Размещён: 24.12.2009 07:16

3 плюса

Еще лучше, используйте fgetc (). scanf () всегда должен быть последним средством.

Автор: anon Размещён: 24.12.2009 06:13

0 плюса

Прежде всего, я буду держать это кратко. Из-за недостаточного количества точек для отправки комментария. Если мы увидим, что число o / p равно (один + номер символа), то это происходит, когда мы нажимаем enter после ввода символов '\ n ', который является непечатаемым символом, также добавляется после вашей строки.

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!  -----------> it is due to reading of the '\n' by scanf

РЕДАКТИРОВАНИЕ Из-за недостатка баллов я мог бы опубликовать это в качестве комментария. Это обходной путь вышеупомянутых ответов

Автор: Kalu Размещён: 14.11.2015 02:54
Вопросы из категории :
32x32