scanf () любопытное поведение! - PullRequest
9 голосов
/ 15 июня 2011

Я недавно наткнулся на любопытный случай (по крайней мере, для меня, так как я не сталкивался с этим раньше). Рассмотрим простой код ниже: -

int x;
scanf("%d",&x);
printf("%d",x);

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

Теперь, если я модифицирую приведенный выше код следующим образом: -

int x;
scanf("%d ",&x);//notice the extra space after %d
printf("%d",x);

Это займет еще один дополнительный ввод, прежде чем он даст результат printfутверждение .. Я не понимаю, почему пробел приводит к изменению поведения scanf () .. Может кто-нибудь объяснить это мне ....

Ответы [ 3 ]

8 голосов
/ 15 июня 2011

С http://beej.us/guide/bgc/output/html/multipage/scanf.html:

Семейство функций scanf () считывает данные из консоли или из потока FILE, анализирует их и сохраняет результаты в переменных, указанных в списке аргументов.

Строка формата очень похожа на таковую в printf () в том, что вы можете сказать ей прочитать "% d", например, для int. Но он также имеет дополнительные возможности, в частности, он может поглощать другие символы во вводе, который вы указываете в строке формата .

Что происходит, так это то, что scanf - это шаблон, соответствующий строке формата (вроде как регулярное выражение). scanf сохраняет текст из стандартного ввода (например, с консоли), пока не будет сопоставлен весь шаблон.

Во втором примере scanf считывает число и сохраняет его в x. Но он еще не достиг конца строки формата - еще остается пробел. Таким образом, scanf считывает дополнительные пробельные символы из стандартного ввода, чтобы (попытаться) сопоставить его.

3 голосов
/ 15 июня 2011

со страницы руководства :

Строка формата состоит из последовательности директив, которые описывают как обработать последовательность ввода символов. Если обработка директива терпит неудачу, дальнейший ввод не читается, и scanf () возвращает. «Отказ» может быть одним из следующих: сбой ввода, означающий, что входные символы были недоступны или совпадали с ошибкой, что означает, что ввод был неуместным (см. ниже).

   A directive is one of the following:

   ?      A  sequence of white-space characters (space, tab, newline, etc;
      see isspace(3)).  This directive matches  any  amount  of  white
      space, including none, in the input.
0 голосов
/ 15 июня 2011

man scanf

[...] Последовательность символов пробела (пробел, табуляция, новая строка и т. Д .; см. Isspace (3)).Эта директива соответствует любому количеству пробелов, включая ни одного, во входных данных.

...