Вводя нецифровые символы в записи, такие как "5h"
или "2t"
для dd
, вы запутываете чтение для ll
во втором scanf
вызове.
%d
говорит scanf
пропустить любой начальный пробел, а затем прочитать десятичные цифры до первого нецифрового символа. Если вы введете строку типа "5h"
или "2t"
, эта начальная цифра будет успешно преобразована и присвоена dd
, но завершающий нецифровый символ останется во входном потоке, а это загрязнение чтения для ll
. В ll
не читается новое значение, вы получаете любое неопределенное значение, которое оно имело при запуске программы.
Всегда проверяйте результат scanf
(и fscanf
и sscanf
) - если это меньше, чем ожидаемое количество входов, то у вас есть соответствиеошибка (некоторые входные данные обрабатываются неправильно). Если это EOF
, значит, у вас возникла ошибка в самом входном потоке.
В этом конкретном случае вы можете обойти проблему, проверив результат scanf
- если это 0
, то в потоке есть плохой символ. Выбросьте его и попробуйте снова:
int r;
while ( ( r = scanf( "%d", &ll ) ) != 1 && r != EOF )
getchar();
Это вызовет scanf
и попытается прочитать значение в ll
. Мы ожидаем, что scanf
вернет 1
при успешном вводе, поэтому мы зациклимся, пока результат scanf
не 1
(and isn 'т EOF
, либо). Если чтение не прошло успешно, мы предполагаем, что во входном потоке застрял нецифровый символ, поэтому мы читаем и отбрасываем его с помощью вызова getchar
.