Scanf (% d,..) в цикле, когда заданный char один раз не блокирует

Я написал этот код:

char str[10];
 while(1)
 {
 scanf("%d",str); 
 }

если задано a char (например, 'a'), цикл просто продолжается, не останавливаясь и запрашивая больше ввода (scanf не блокируется внезапно)

почему?:-)

6 ответов

Потому что a не является десятичным целым. scanf будет пытаться прочитать его, но не выполнить и не продвигать его внутренний указатель, поэтому он будет бесконечно пытаться читать один и тот же a как десятичный знак и терпеть неудачу.

рассмотрим следующую программу:

int d;
char c;
scanf("%d", &d);
scanf("%c", &c);

если вы введете a, первый scanf завершится неудачно, а второй будет читать 'a' в c. Это должно объяснить проблему:)


Поскольку он не может принудить 'a' к целочисленной форме, поэтому он "возвращает его в поток" (там нет реального потока, просто манера речи). Затем ваш бесконечный цикл заставляет его снова попробовать ту же процедуру. Бесконечно.


входной буфер имеет a....

ваш scanf пытается прочитать int:

a....
 ^
 oops : cannot be int. stop scanfing

а в следующем цикле a все еще существует.

scanf, как правило, трудно использовать правильно, но вы должны всегда проверять его возвращаемое значение:

int chk;
chk = scanf(...); /* pseudo-code */
if (chk != EXPECTED_VALUE) { /* HANDLE ERROR! */ }


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


Чтобы исправить это, вам нужно проверить, чтобы scanf() действительно прочитал нужные вам значения. scanf() возвращает количество успешно прочитанных элементов. Итак, сохраните возвращаемое значение, проверьте, не ли оно 1. Если оно 0, то 0 элементов были прочитаны, и вам нужно очистить поток, прежде чем повторять попытку. (edit: Ну, может быть, не обязательно его опустошить, но, по крайней мере, пройдите мимо оскорбительных данных, которые в потоке)

Как говорили другие, он пытается прочитать целое число, видит 'a', не может прочитать целое число, но затем 'a' все еще находится в потоке при повторном попытке.


Ваша строка формата %d not %s. Scanf() ищет целое число, а не строку. Ваша петля держится навсегда, потому что она говорит while(1), поэтому она никогда не заканчивается.

licensed under cc by-sa 3.0 with attribution.