CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по библиотечным функциям языка Си
scanf - форматный ввод
Описание
Это процедуры форматного ввода. Многоточия обозначают
аргументы (от 0 и более), которые являются указателями
на переменные для ввода информации;
fscanf читает из входного потока fp.
scanf читает из stdin.
sscanf читает из указанного буфера buffer. Считывае-
мые литеры преобразуются в соответствии с
форматной строкой, и эти преобразованные зна-
чения размещаются по аргументам-указателям.
Аргументы должны быть указателями на то, куда будут
записываться значения.
Форматная строка состоит из:
1. Пробелов, литер табуляции и новой строки, ко-
торые вызывают пропуск ввода до следующей, не
'белой' (whitespace) литеры.
2. Других литер, кроме литеры %, которые "один в
один" переправляются во ввод.
3. Спецификаций преобразования, которые выглядят
следующим образом:
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
_ '%'['*'][ширина поля][точность]литера преобразования _
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Эта строка определяет, каким образом вводимые символы
должны преобразовываться и записываться по соответ-
ствующим аргументам-указателям. Преобразование продол-
жается до первой неподходящей входной литеры или ис-
черпания ширины поля.
Символ '*' является флагом подавления присваивания. Он
вызывает выполнение преобразования, но результат игно-
рируется и для него не нужен соответствующий аргумент-
-указатель.
Если число аргументов-указателей меньше спецификаций
преобразования, результат непредсказуем. Если же число
аргументов-указателей больше, лишние указатели игнори-
руются.
Ширина поля (field_width)
ДДДДДДДДДДДДДДДДДДДДДДДД
Это последовательность десятичных цифр, определяю-
щая максимальное число литер в поле ввода.
Точность (precision)
ДДДДДДДДДДДДДДДДДДДД
L или l (Нижний регистр L)
Если 'l' используется с одной из (d, i, o, u, x)
литер преобразования, то она означает, что аргу-
мент является указателем на long, а не на int. l
или L флаг, при использовании (e) или (f) литер
преобразования, означает, что аргумент является
указателем на double, а не на float.
h Аргумент является указателем на short.
Литера преобразования (conv_char)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
К литерам преобразования относятся:
d Ожидается ввод целого числа, аргумент-
-указатель должен быть указателем на int.
e,f,g,E,G Ожидается ввод числа с плавающей за пятой.
Формат числа такой же, как и в Cи.
Аргумент должен быть указателем на float
(или double, если используется 'l' или 'L').
i Ожидается ввод целого числа. Если число на-
чинается с 0, оно воспринимается как восьме-
ричное. Если число начинается с 0x или 0X,
оно шестнадцатиричное. Аргумент должен быть
указателем на int.
b Ожидается ввод двоичного числа. Аргумент
должен быть указателем на целое.
o Ожидается ввод восьмеричного числа. Аргу-
мент должен быть указателем на int.
x,X Ожидается ввод шестнадцатиричного числа
(адреса). Аргумент должен быть указателем
на int.
p Ожидается ввод шестнадцатиричного числа.
Аргумент должен быть указателем на указа-
тель.
u Ожидается ввод беззнакового целого числа.
Аргумент должен быть указателем на unsigned.
n По указателю, заданному аргументом, записы-
вается число литер, считанных к этому мо-
менту при этом обращении к scanf().
[ Ожидается ввод строки литер. Между [ и
закрывающей ] должны быть литеры, допусти-
мые в этой строке. Если за скобкой [ сразу
следует литера^, допустимыми литерами вво-
димой строки являются все за исключением
перечисленных между ^ и ]. Аргумент должен
быть указателем на строку. В конце строки
добавляется 0.
s Ожидается ввод строки литер. Аргумент дол-
жен быть указателем на строку. Поле вво-
да заполняется до тех пор, пока не считает-
ся пробел или литера новой строки, которые
не являются частью поля ввода. К концу
строки добавляется 0.
c Ожидается ввод литеры. Аргумент должен быть
указателем на литеру. Если определена шири-
на поля (field_width), то считывается опре-
деленное шириной поля число литер и аргу-
мент в этом случае должен быть указателем
на массив литер, достаточный для размещения
результата.
% Соответствует вводу литеры %.
Символы преобразования e, g и x могут быть заглав-
ными. Другие же символы будут давать непредсказуе-
мые результаты. Неподходящие литеры остаются непро-
читанными из входного потока. Нет прямого пути оп-
ределения того, достигнуты ли точные соответствия
или были подавления присваиваний, кроме использова-
ния символа преобразования %n.
Использование
#include <stdio.h>
int scanf(char *format,...); /* ANSI */
int fscanf(FILE *fp, char *format,...); /* ANSI */
int sscanf(char *buffer, char *format,...); /* ANSI */
Возвращаемое значение
Возвращается число присвоенных элементов ввода, исклю-
чая преобразования с подавленным присваиванием. Если
встречается конец файла до того, как были выполнены
какие-либо присваивания и возникли какие-либо конфлик-
ты (формата и ввода), возвращается значение EOF.
Scanf() обычно завершает работу, когда достигает конца
строки формата.
Пример
#include <stdio.h>
main()
{
unsigned int result, val;
printf("Введите десятичное число:");
result = scanf("%i", &val);
printf("The decimal number [%d] is [%4x]
hexadecimal", val, val);
}
Рекомендация
Смотрите также printf, fscanf, sscanf
