Символы-спецификаторы и разъяснение их смысла приведены в таблице B-1. Если за % нет правильного символа-спецификатора, результат не определен.
int printf(const char *format, ...);
printf(...) полностью эквивалентна fprintf(stdout, ...).
int sprintf(char *s, const char *format, ...)
sprintf действует так же, как и printf, только вывод осуществляет в строку s, завершая ее символом ' '. Строка s должна быть достаточно большой, чтобы вмещать результат вывода. Возвращает количество записанных символов, в число которых символ ' ' не входит.
int vprintf (const char *format, va_list arg)
int vfprintf (FILE *stream, const char *format, va_list arg)
int vsprintf (char *s, const char *format, va_list arg)
Функции vprintf, vfprintf и vsprintf эквивалентны соответствующим printf- функциям с той лишь разницей, что переменный список аргументов представлен параметром arg, инициализированным макросом va_start и, возможно, вызовами va_arg (см. в B7 описание <stdarg.h>).
Таблица B-1. Преобразования printf
Символ Тип аргумента; вид печати
d,
i int; знаковая десятичная запись
o unsigned int; беззнаковая восьмеричная запись (без 0 слева)
x,
X unsigned int; беззнаковая шестнадцатеричная запись (без 0x или 0X слева), в качестве цифр от 10 до 15 используются abcdef для x и ABCDEF для X
u unsigned int; беззнаковое десятичное целое
c int; единичный символ после преобразования в
unsigned char s char *; символы строки печатаются, пока не встретится ' ' или не исчерпается количество символов, указанное точностью
f double; десятичная запись вида [-]mmm.ddd, где количество
d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки
e,
E double; десятичная запись вида [-]m.dddddde±xx или запись вида [-]m.ddddddE±xx, где количество
d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки
g,
G double; используется
%e и
%E, если порядок меньше -4 или больше или равен точности; в противном случае используется
%f. Завершающие нули и точка в конце не печатаются
p void *; печатает в виде указателя (представление зависит от реализации
n int *; число символов, напечатанных к данному моменту данным вызовом
printf,
записывается в аргумент. Никакие другие аргументы не преобразуются
% никакие аргументы не преобразуются; печатается
%B1.3. Форматный ввод
Функции scanf имеют дело с форматным преобразованием при вводе
int fscanf(FILE *stream, const char *format, ...);
fscanf читает данные из потока stream под управлением format и преобразованные величины присваивает по порядку аргументам, каждый из которых должен быть указателем. Завершает работу, если исчерпался формат. Выдает EOF по исчерпании файла или перед любым преобразованием, если возникла ошибка; в остальных случаях функция возвращает количество преобразованных и введенных элементов.
Форматная строка обычно содержит спецификации преобразования, которые используются для управления вводом. В форматную строку могут входить:
• пробелы и табуляции, которые игнорируются;
• обычные символы (кроме %), которые ожидаются в потоке ввода среди символов, отличных от символов-разделителей;
• спецификации преобразования, состоящие из %; необязательного знака *, подавляющего присваивание; необязательного числа, специфицирующего максимальную ширину поля; необязательных h, l или L, указывающих размер присваиваемого значения, и символа-спецификатора преобразования.
Спецификация преобразования определяет преобразование следующего поля ввода. Обычно результат размещается в переменной, на которую указывает соответствующий аргумент. Однако если присваивание подавляется с помощью знака *, как, например, в %*s, то поле ввода просто пропускается, и никакого присваивания не происходят. Поле ввода определяется как строка символов, отличных от символов-разделителей; при этом ввод строки прекращается при выполнении любого из двух условий: если встретился символ-разделитель или если ширина поля (в случае, когда она указана) исчерпана. Из этого следует, что при переходе к следующему полю scanf может "перешагивать" через границы строк, поскольку символ новой строки является символом-разделителем. (Под символами-разделителями понимаются символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и смены страницы.)
Символ-спецификатор указывает на способ интерпретации поля ввода. Соответствующий аргумент должен быть указателем. Список допустимых символов-спецификаторов приводится в таблице B-2.
Символам-спецификаторам d, i, n, o, u и x может предшествовать h, если аргумент есть указатель на short (а не int) или l (буква ell), если аргумент есть указатель на long. Символам-спецификаторам e, f и g может предшествовать l, если аргумент - указатель на double (а не float), или L, если аргумент - указатель на long double.
int scanf (const char *format, ...);
scanf(...) делает то же, что и fscanf(stdin, ...).
int sscanf (const char *s, const char *format, ...);
sscanf(s, ...) делает то же, что и scanf(...), только ввод символов осуществляет из строки s.
Таблица B-2. Преобразования scanf
Символ Данные на вводе; тип аргумента
d десятичное целое;
int * i целое:
int *. Целое может быть восьмеричным (с нулем слева) или шестнадцатеричным (с 0x или 0X слева)
o восьмеричное целое (с нулем слева или без него);
int * u беззнаковое десятичное целое;
unsigned int * x шестнадцатеричное целое (с 0x или 0X слева или без них):
int * c символы,
char *. Символы ввода размещаются в указанном массиве в количестве, заданном шириной поля; по умолчанию это количество равно 1. Символ' ' не добавляется. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент. Чтобы прочесть следующий символ-разделитель, используйте %1s
s строка символов, отличных от символов-разделителей (записывается без кавычек);
char *, указывающий на массив размера достаточного, чтобы вместить строку и добавляемый к ней символ ' '
e,
f,
g число с плавающей точкой;
float *. Формат ввода для
float состоит из необязательного знака, строки цифр, возможно с десятичной точкой, и необязательного порядка, состоящего из
E или
e и целого, возможно со знаком
p значение указателя в виде, в котором printf ("%р") его напечатает;
void * n записывает в аргумент число символов, прочитанных к этому моменту в этом вызове;
int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается
[...] выбирает из ввода самую длинную непустую строку, состоящую из символов, заданных в квадратных скобках:
char *. В конец строки добавляется ' '. Спецификатор вида
[]...] включает
] в задаваемое множество символов
[^...] выбирает из ввода самую длинную непустую строку, состоящую из символов, не входящих в заданное в скобках множество. В конец добавляется ' '. Спецификатор вида
[^]...] включает
] в задаваемое множество символов
% обычный символ
%; присваивание не делается
B1.4. Функции ввода-вывода символов