ival
не инициализирован, поэтому он может иметь любое значение. Причина заключается в том, что, c
получает 'A'
(через getchar()
), а затем scanf
не удается прочитать номер (со следующего символа на входе, 'b'
, не десятичное число), поэтому он никогда не коснется ival
.
Вы можете проверить возвращаемое значение scanf
, чтобы увидеть, если он выходит из строя или преуспевает:
if (scanf("%d", &ival) != 1)
printf("you need to enter a number\n");
else
printf("entered: %d\n", ival);
Обратите внимание, что scanf
возвращает количество элементов успешно считанных и присвоенных. Например, scanf("%d %f %c", ...)
вернет 3, если все три элемента были правильно прочитаны.
Обратите внимание, что назначен означает, что игнорируемый вход (например, с помощью модификатора присвоения гасящего (*
)) не учитывается возвращаемым значение scanf
(C11, 7.21.6.2.10,16). Кроме того, %n
не влияет на возвращаемое значение scanf
(C11, 7.21.6.2.12).
небольшая коррекция: 'scanf' возвращает количество успешно сопоставленных элементов * и *. Концепция отличается; если вы используете '% * s', это не будет считаться с окончательным значением возврата, но оно могло бы прочитать его правильно. –
Благодарим вас за ответ. – ahmetlutfu
@ FilipeGonçalves, вы абсолютно правы. Я добавил эту информацию. – Shahbaz