Почему getchar() не заставит меня нажать enter после scanf()?
Я изучаю C, и я использую "getchar()", чтобы остановить командные окна, чтобы я мог видеть упражнения, которые я делаю, но это просто не работает. heres образец:
#include <stdio.h>
int main()
{
int value;
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
scanf("%d", &value);
switch (value)
{
case 1:
printf("you selected the option 1.");
break;
case 2:
printf("you selected the option 2.");
break;
case 3:
printf("you selected the option 3.");
break;
case 4:
printf("goodbye");
break;
default:
printf("thats not an option");
break;
}
getchar();
return 0;
}
это результат:
- вариант 1.
- вариант 2.
- вариант 3.
- Выход.
Сделайте выбор: 1
вы выбрали вариант 1.
Возвращенный процесс 0 (0x0) время выполнения: 3.453 с
Нажмите любую клавишу, чтобы продолжить.
Почему он не ждет ввода "getchar()"?
Ответы
Ответ 1
В вашем сканировании есть только число, но не конечная новая строка. Помещение новой строки или пробела после% d приведет к возникновению противоположной проблемы, слишком зачитывая слишком далеко.
Вот почему люди не любят scanf.
Я бы предложил прочитать фактическую строку (используйте fgets(3)
), а затем используя sscanf()
для сканирования строки.
Ответ 2
Прежде всего, не используйте fflush(), чтобы очистить входной поток; поведение undefined:
7.19.5.2.2 Если поток указывает на выходной поток или поток обновления, в котором самые последние операция не была введена, функция fflush вызывает любые неписанные данные для этого потока для доставки в среду хоста, которая должна быть записана в файл; в противном случае поведение undefined.
Проблема заключается в том, что конечная новая строка не потребляется спецификатором преобразования "% d", поэтому ее сразу же снимает с помощью getchar()
. Нет никакого лучшего способа справиться с этим, но в целом подход состоит в том, чтобы прочитать всю строку как текст (используя либо fgets()
, либо scanf()
с размером спецификатора преобразования% s), который будет потреблять новую строку, затем конвертировать в целевой тип данных с помощью sscanf()
или strtol()
или strtod()
.
Ответ 3
Может ли getchar получить возврат каретки, который вы вводите после 1?
Ответ 4
Getchar() читает \n с клавиатуры в scanf - см. здесь для получения дополнительной информации
Ответ 5
вы получаете возврат каретки, способ, которым я обойду его, определить char и просто сканировать возврат каретки,
char ch;
(перед тем, как ваш getch() введите следующее)
scanf("%c",&ch);
getchar();
должен работать таким образом, а не самый эффективный способ сделать это, но работает для меня.
Ответ 6
Я думаю, что вы вводите ввод после ввода "1". Он будет принят getchar()
. Таким образом, вы можете решить проблему просто добавив дополнительный getchar()
после первоначального (непосредственно перед return 0;
).
** Я тестировал это, и он работал.
Ответ 7
Как уже упоминалось, scanf оставляет \n после чтения пользовательского ввода.
Soultion: добавить getchar() прямо после scanf.
Это компенсирует дефицит scanf.
то есть.
int value;
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
scanf("%d", &value);
getchar();
switch (value)
Ответ 8
#include <stdio.h>
#include<conio.h>
void main()
{
int value;
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
scanf("%d", &value);
switch (value)
{
case 1:
printf("you selected the option 1.");
break;
case 2:
printf("you selected the option 2.");
break;
case 3:
printf("you selected the option 3.");
break;
case 4:
printf("goodbye");
break;
default:
printf("thats not an option");
break;
}
getch();
}
Ответ 9
чтобы ваша программа работала, вы должны "очистить" входной поток до вызова getchar() с вызовом fflush (stdin). Это означает, что при вводе на клавиатуре числа, а затем ключа возврата входной буфер получает оба символа, например "1" и "\n", и ваш вызов scanf получает только "1", \n 'остается во входном буфере. Когда вы вызываете getchar, вы получаете "gettin", который остается "\n". Промывка входа отбрасывает весь буфер.