C - пытается прочитать один символ из стандартного ввода (и не удается) w / scanf / getchar
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
отлично работает при проверке пользовательского ввода!
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:130 плюса
Прежде всего, я буду держать это кратко. Из-за недостаточного количества точек для отправки комментария. Если мы увидим, что число 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РЕДАКТИРОВАНИЕ Из-за недостатка баллов я мог бы опубликовать это в качестве комментария. Это обходной путь вышеупомянутых ответов
Вопросы из категории :
- c Как вы форматируете unsigned long long int, используя printf?
- c What are the barriers to understanding pointers and what can be done to overcome them?
- c Как реализовать продолжения?
- c Как вы передаете функцию в качестве параметра в C?
- c Как получить список каталогов в C?
- c В чем разница между #include <filename> и #include "filename"?
- c Всегда ли выгодно использовать «goto» в языке, который поддерживает циклы и функции? Если так, то почему?
- c В чем разница между ++ i и i ++?
- c Есть ли разница в производительности между i ++ и ++ i в C?
- c Какой самый лучший бесплатный детектор утечки памяти для программы на C / C ++ и ее подключаемых библиотек DLL?
- scanf Разбор ввода с помощью scanf в C
- scanf Ищете C # эквивалент Scanf
- scanf Как вы можете вводить пробелы с помощью scanf?
- scanf Scanf пропускает все остальные циклы while в C
- scanf Почему scanf () вызывает бесконечный цикл в этом коде?
- scanf Принимает ли scanf () '\ n' в качестве остатка ввода от предыдущего scanf ()?
- scanf В чем разница между спецификаторами преобразования% i и% d в отформатированных функциях ввода-вывода (* printf / * scanf)
- scanf C - пытается прочитать один символ из стандартного ввода (и не удается) w / scanf / getchar
- scanf Использование препроцессора C для создания строкового литерала для scanf?
- scanf Как пропустить строку при сканировании текстового файла?