Редактировать: Назад, когда я впервые написал этот ответ, я был настолько глуп и неосведомлен о том, как 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;
}