2014-01-05 6 views
2

Можете ли вы объяснить одну вещь, в следующем коде:Почему операции с чередованием scanf() + printf() приводят к выполнению первых вызовов scanf(), а затем вызовы printf()?

#include<stdio.h> 

int main() 
{ 
    int n;char ch,ch1; 
    scanf("%d\n",&n); 
    printf("d-%d \n",n); 

    scanf("\n%c",&ch); 
    printf("ch-%d \n",ch); 

    scanf("\n%c",&ch1); 
    printf("ch1-%d \n",ch1); 

    printf("%d %d %d\n",n,ch,ch1); 
    return 0; 
} 

Почему после ввода значения п, то непосредственно запрашивает значения ч, а затем непосредственно выполняет инструкции для печати их соответствующие значения т.е. заявления:

printf("d-%d \n",n); 
printf("ch-%d \n",ch); 
+2

Ugh. Не знаю, где мои комментарии, возможно, была потеря данных. В любом случае @OP: так как это вопрос, на который можно ответить напрямую, прочитав ['man 3 scanf'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html), он не подходит для переполнения стека. –

+1

Кроме того, [dupe1] (http://stackoverflow.com/questions/20934304/cant-understand-whitespace-handling-in-scanf), [dupe2] (http://stackoverflow.com/questions/20920907/cant- поймите-на-коду-поведение). (Этот пользователь задает один и тот же вопрос два раза в день. Это не нормально.) –

+2

Повторное открытие, так как я * просто * закрыл один из других вопросов как дубликат этого (а другой как дубликат этого). – Shog9

ответ

5

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 сек вызова (что это не так!).

+0

Я старался изо всех сил. Надеюсь, вы поймете. Если у вас есть какие-либо вопросы относительно этого, дайте мне знать. – haccks

2

пробельные в формате scanf, как и любой другой пробел в формате scanf. Он просто сообщает scanf пропустить любые пробелы во входе.

Большинство форматных кодов не нужно, хотя они пропускают ведущие пробелы автоматически, но тот, который делает (если вы не хотите читать пробельный символ), является кодом формата "%c".

Возможно, вы также захотите прочитать this reference.

+0

по-моему, проблема ОП заключается в понимании буферизованной природы ввода и в том, что символ '\ n' вокруг хоть и невидимый, но я, конечно, ошибаюсь – ShinTakezou

Смежные вопросы