Функция scanf

Scanf() – основная функция ввода с консоли. Она предназначена для ввода

данных любого встроенного типа и автоматически преобразует введенное число в

заданный формат.

<span style="color: #0000ff;">int scanf(char *format, ...)

</span>

Управляющая строка содержит три вида символов: спецификаторы формата,

пробелы и другие символы. Команды или спецификаторы формата начинаются с

символа %. Они перечислены ниже:

%с – чтение символа,

%d – чтение десятичного целого,

%i – чтение десятичного целого,

%е – чтение числа типа float,

%h – чтение short int.

%о – чтение восьмеричного числа,

%s – чтение строки.

%х – чтение шестнадцатеричного числа,

%р – чтение указателя,

%n – чтение указателя в увеличенном формате.

Cимвол пробела в управляющей строке дает команду пропустить один или

более пробелов в потоке ввода. Кроме пробела, может восприниматься символ табу-

ляции или новой строки. Ненулевой символ указывает на чтение и отбрасывание

(discard) этого символа. Все переменные, которые мы вводим, должны указываться с

помощью адресов, как и положено в функциях языка С.

Строка будет читаться как массив символов, и поэтому имя массива без ин-

дексов указывает адрес первого элемента.

Разделителями между двумя вводимыми числами являются символы пробела,

табуляции или новой строки. Знак * после % и перед кодом формата дает команду

прочитать данные указанного типа, но не присваивать это значение. Так,

scanf(“%d%*c%d”, &i, &j);

при вводе 50+20 присвоит переменной i значение 50, переменной j – значение 20, а

символ + будет прочитан и проигнорирован.

В команде формата может быть указана наибольшая ширина поля, которая

подлежит считыванию. К примеру,

<span style="color: #0000ff;">scanf("%5s", str);</span>

указывает на необходимость прочитать из потока ввода первые 5 символов. При

вводе 123456789 массив str будет содержать только 12345, остальные символы бу-

дут проигнорированы. Разделители: пробел, символ табуляции и символ новой

строки – при вводе символа воспринимаются, как и все другие символы.

Если в управляющей строке встречаются какие-либо другие символы, то они

предназначаются для того, чтобы определить и пропустить соответствующий сим-

вол. Поток символов 5plusl0 оператором

<span style="color: #0000ff;">    scanf("%dplus%d", &amp;i, &amp;j);</span>

присвоит переменной i значение 5, переменной j – значение 10, а символы plus про-

пустит, так как они встретились в управляющей строке. К недостаткам, правда пре-

одолимым, функции scanf() относится невозможность выдачи приглашения к вводу,

т. е. приглашение должно быть выдано до обращения к функции scanf().

Одной из мощных особенностей функции scanf() является возможность зада-

ния множества поиска (scanset). Множество поиска определяет набор символов, с

которыми будут сравниваться читаемые функцией scanf() символы. Функция scanf()

читает символы до тех пор, пока они встречаются в множестве поиска. Как только

символ, который введен, не встретился в множестве поиска, функция scanf() перехо-

дит к следующему спецификатору формата. Множество поиска определяется спи-

ском символов, заключенных в квадратные скобки. Перед открывающей скобкой

ставится знак %. Чтобы увидеть, как используется эта возможность, рассмотрим

пример.

<span style="color: #0000ff;">#include &lt;stdio.h&gt;</span>
<span style="color: #0000ff;">/* Форматный ввод с использованием</span>
<span style="color: #0000ff;">множества поиска */</span>
<span style="color: #0000ff;">main (void)</span>
<span style="color: #0000ff;">{</span>
<span style="color: #0000ff;">char s[10], t[10];</span>
<span style="color: #0000ff;">scanf ("%[0123456789]%s", s, t);</span>
<span style="color: #0000ff;">
printf ("\n%s..%s", s, t);</span>
<span style="color: #0000ff;">}</span>

Введем следующий набор символов:
“123abc456″
На экране программа выдаст
123..аЬс45б
Так как а не входит в множество поиска (оно состоит только из цифр), то ввод
по первому спецификатору формата прерывается и начинается ввод по второму спецификатору формата.
При задании множества поиска можно также использовать символ “дефис”
для задания промежутков, а также максимальную ширину поля ввода

<span style="color: #0000ff;">scanf("%10[A-Z1-5]%s", s);</span>

Такой формат позволяет вводить в строку s заглавные буквы от А до Z, а так-
же цифры от 1 до 5. Кроме того, длина строки ограничена 10 символами.
Можно также определить символы, которые не входят в множество поиска.
Перед первым из этих символов ставится знак ^. И множество символов различает,
естественно, строчные и прописные буквы.

При вызове функции форматного ввода scanf форматная строка должна содержать только форматы. Этим функция scanf отличается от printf. Вместо значений печатаемых переменных или выражений, как в функции printf, функция scanf должна содержать указатели на вводимые переменные! Для начинающих это постоянный источник ошибок. Необходимо запомнить: функции scanf нужно передавать адреса переменных, в которые надо записать введенные значения. Если вместо адресов переменных передать их значения, то функция scanf все равно проинтерпретирует полученные значения как адреса, что при выполнении вызовет попытку записи по некорректным адресам памяти и, скорее всего, приведет к ошибке типа Segmentation fault. Пример: пусть нужно ввести значения трех вещественных переменных a, b, c. Тогда следует использовать фрагмент

<span style="color: #0000ff;">scanf("%lf%lf%lf", &amp;a, &amp;b, &amp;c);</span>

Ошибка, которую часто совершают начинающие: передача функции scanf значений переменных вместо адресов:

<span style="color: #0000ff;">scanf("%lf%lf%lf", a, b, c); // Ошибка! Передаются
                     // значения вместо указателей

</span>
int getchar(void);
????????: ?????? ???? ?????? ?? ?????? ???????????? ?????? stdin
(?.?. ?? ???????????, ???? ???? ?? ?????????????).
?????????? ??? ???????????? ???????.
? ?????? ?????? ?????????? ????????? EOF.
???????? ????????, ??? ??-?? ????????????? ??????????????? ?? ????-
?? ??????? ?????????? ???????? ???? int, ? ?? char.
?? ????????? ??????? getchar ????? ????? ??????? Enter, ?. ?. ??
?????? ???????????? ??? ????????? ?Press any key to continue?. ??????
??????, ??? ?????? ??????????? (?????????? ? ????? ????????????
???????) ???????? ?? ????????.

Оставить комментарий

Вы должны быть зарегистрированы чтобы комментировать.