scanf("%d\n",&n);
пропускает любое количество завершающих пробелов (в том числе нет) после фактического ввода. Он также может быть записан как scanf("%d ",&n);
.
scanf("\n%c",&ch);
пропускает любое количество ведущих белых пробелов (в том числе нет) до фактического ввода. Он также может быть записан как scanf(" %c",&ch);
.
ПРИМЕЧАНИЕ: Белое пространство в спецификаторе формата может пропускать любое количество белых пробелов.
Что именно это означает: Пропуск белых пробелов?
Это означает, что scanf
неоднократно считывает символы пробела с ввода до тех пор, пока не достигнет небелого пробега. персонаж. Теперь в буфере нет пробелов..
Когда он встречает небелых-пространство персонажу, то этот символ положить обратно быть прочитан снова во время сканирования следующего элемента ввода или во время следующего вызова scanf
.
Теперь на ваш вопрос.
Почему перемеженные scanf()
+ printf()
заявления приводят в обоих scanf()
вызовов, исполняющих первый, то оба printf()
звонки?
Я принимаю вход для n
is 15
. Когда вы нажимаете Введите ключ, тогда символ \n
будет с 15
во входном буфере. scanf("%d\n",&n);
читает 15
, а затем пропускает \n
. Теперь этот scanf
ждет ввода небелого пробела (в отличие от того, что вы предположили, что 15
должен быть напечатан). Когда вы введете a
, он вернет его для следующего звонка scanf
.Следующее утверждение scanf("\n%c",&ch);
читает это a
из буфера и не позволяет пользователю вводить значение для ch
. Поскольку значение n
и ch
как сейчас читают эти scanf
с, это, кажется, что оба
printf("d-%d \n",n);
printf("ch-%d \n",ch);
выполняет после того, как оба в scanf
сек вызова (что это не так!).
Ugh. Не знаю, где мои комментарии, возможно, была потеря данных. В любом случае @OP: так как это вопрос, на который можно ответить напрямую, прочитав ['man 3 scanf'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html), он не подходит для переполнения стека. –
Кроме того, [dupe1] (http://stackoverflow.com/questions/20934304/cant-understand-whitespace-handling-in-scanf), [dupe2] (http://stackoverflow.com/questions/20920907/cant- поймите-на-коду-поведение). (Этот пользователь задает один и тот же вопрос два раза в день. Это не нормально.) –
Повторное открытие, так как я * просто * закрыл один из других вопросов как дубликат этого (а другой как дубликат этого). – Shog9