В то время как Loop разрывается с Char - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть следующий код C

int selectTask = 1;
while (selectTask > 0 && selectTask < 7) {
  printf("Please input which task to test: ");
  scanf("%d", &selectTask);
}

Это работает так, как задумано, пока я не введу символ вместо числа, а затем просто бесконечно зацикливает мой printf. Кто-нибудь знает, почему это происходит?

1 Ответ

6 голосов
/ 05 апреля 2019

scanf работает от буфера строки.Если буфер исчерпан, он занимает новую строку;но если в буфере еще есть что-то, он фактически не принимает новый ввод.

Кроме того, scanf потребляет именно то, что вы говорите.Если вам нужен номер, он будет использовать номер или потерпит неудачу.Возвращаемое значение scanf - это количество вещей, которые он успешно потребил.

Таким образом, что происходит, ваш первый scanf читает новую строку (так как в буфере ничего нет);если первый символ окажется не числом, он не будет ничего потреблять, оставит буфер как есть и вернет 0 как «ноль успешно использованных вещей».В следующий раз, когда вы попросите номер, он увидит тот же символ и снова потерпит неудачу, и снова ничего не потребит.Как будто у этого персонажа застряло в горле.

Вы можете обойти его, прочитав остаток буфера при сбое, fflush - запустив буфер, прочитав строку и проанализировав ее самостоятельно ...или, поскольку вам нужен только один символ, оставьте scanf и просто используйте getchar.

tl; dr: Не игнорируйте scanf возвращаемое значение:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...