Редактировать: Когда я впервые написал этот ответ, я был настолько глуп и не знал, как работает scanf()
.
- Прежде всего позвольте мне кое-что прояснить,
scanf()
не является сломанной функцией, если я не знаю, как работает scanf()
, и я не знаю, как ее использовать, то я, вероятно, не читал руководство для scans()
, и это не может быть scanf()
виноват.
- Во-вторых, чтобы понять, что не так с вашим кодом, вам нужно знать, как работает
scanf()
.
Когда вы используете scanf("%d", &price)
в своем коде, scanf()
пытается прочитать integer
из ввода, но если вы вводите нечисловое значение, scanf()
знает, что это неправильный тип данных, поэтому он помещает прочитанный ввод обратно в буфер. , однако в следующем цикле неверный ввод все еще находится в буфере, что снова приведет к сбою scanf()
, поскольку буфер не был очищен, и этот цикл будет продолжаться вечно.
Чтобы решить эту проблему, вы можете использовать возвращаемое значение scanf()
, которое будет числом успешных входных данных, прочитанных, однако вам нужно отбросить недопустимые входные данные, очистив буфер, чтобы избежать бесконечного цикла, входной буфер очищается. когда нажата клавиша enter
, вы можете сделать это с помощью функции getchar()
, чтобы сделать паузу для получения ввода, что потребует от вас нажатия клавиши enter
, таким образом отбрасывая неверный ввод, обратите внимание, что это не заставит вас нажимать enter
дважды, независимо от того, ввели ли вы правильный тип данных, потому что newline character
все еще будет в буфере. После того, как scanf()
успешно завершит чтение integer
из ввода, он поместит \n
обратно в буфер, поэтому getchar()
прочитает его, но, поскольку он вам не нужен, его можно безопасно отбросить:
#include <stdio.h>
int main(void)
{
int flag = 0;
int price = 0;
int status = 0;
while (flag == 0 && status != 1)
{
printf("\nEnter Product price: ");
status = scanf("%d", &price);
getchar();
if (price == 0)
printf("input not valid\n");
else
flag = 1;
}
return 0;
}
person
ilgaar
schedule
31.12.2013