НАЗВАНИЕ
printf, fprintf, sprintf, snprintf, asprintf, vprintf,
vfprintf, vsprintf, vsnprintf, vasprintf - вывод с
преобразованием по формату
СИНТАКСИС
#include <stdio.h> int printf (format, val ...) char *format; int fprintf (stream, format, val ...) FILE *stream; char *format; int sprintf (s, format [, val] ...) char *s, *format; int snprintf(char *str, size_tsize, const char *format, ...) int asprintf(char **ret, const char *format, ...) #include <stdarg.h> int vprintf(const char *format, va_list ap) int vfprintf(FILE *stream, const char *format, va_list ap) int vsprintf(char *str, char *format, va_list ap) int vsnprintf(char *str, size_t size, const char *format, va_list ap) int vasprintf(char **ret, const char *format, va_list ap)
ОПИСАНИЕ
Функция printf направляет данные в стандартный поток
вывода stdin. Функция fprintf направляет данные в поток
вывода, заданный аргументом stream. Функция sprintf
направляет данные, заканчивающиеся пустым символом
(\0), в массив s; пользователь должен позаботиться о
выделении достаточного количества памяти для массива.
Каждая функция возвращает число переданных символов (не
считая пустого в случае sprintf), или отрицательное
число, если при выводе обнаружилась ошибка.
Каждая из перечисленных функций преобразует, форматирует и печатает выводимые значения val под управлением формата, заданного аргументом format. Формат - это цепочка символов, содержащая об екты двух категорий: обычные символы, которые просто копируются в выходной поток, и спецификаторы преобразований, каждому из которых соответствует одно, несколько или ни одного из выводимых значений. Если выводимых значений val недостаточно, результат непредсказуем; если их слишком много, избыточные игнорируются.
Каждый спецификатор преобразования начинается символом %, после которого последовательно записываются:
Вместо последовательности цифр ширину поля и точность можно обозначить звездочкой. Это означает, что в качестве ширины поля (или точности) используется целое значение val из списка аргументов; оно должно предшествовать соответствующему выводимому значению. Если значение, задающее ширину поля, отрицательно, то считается, что задан флаг -, а в качестве ширины поля берется абсолютная величина значения. Если отрицательно значение, задающее точность, она принимается равной нулю.
Флаги и их смысл:
- | Выравнивание результата преобразования по левой границе. |
---|---|
+ | Обязательное изображение знака (для чисел со знаком). |
пробел | Если первый символ результата преобразования со знаком отличен от + и -, то изображение результата предваряется пробелом. Тем самым флаг + аннулирует действие флага пробел. |
# | Этот флаг означает, что значение преобразуется к "альтернативной форме". Для преобразований c, d, i, s, u этот флаг не имеет значения. Для преобразования типа o результат изображается с увеличенной точностью, с тем чтобы первая цифра результата была нулем. Для преобразований типа x, X ненулевой результат будет изображаться с префиксом 0x или 0X. Для преобразований типа e, E, f, g, G результат обязательно изобразится с десятичной точкой, даже если за ней нет цифр (обычно точка в этом случае опускается). Для преобразований g, G не подавляются незначащие хвостовые нули (что обычно делается). |
Символы, обозначающие тип преобразования, и их смысл:
d, i, o, u, x, X | Целое выводимое значение преобразуется в десятичное со знаком (d, i), беззнаковое восьмеричное (o), десятичное (u) или шестнадцатеричное (x, X); буквы abcdef изображают шестнадцатеричные цифры при преобразовании x, а ABCDEF - при преобразовании X. Точность задает минимальное количество цифр в изображении результата; если результат можно изобразить меньшим количеством цифр, то слева добавляются незначащие нули. Значение точности по умолчанию равно 1. Результат преобразования нуля с нулевой точностью - пустая цепочка. |
---|---|
f | Выводимое значение типов float или double преобразуется в десятичное число и изображается в виде [-]ddd.ddd, где число цифр после точки определяется точностью. Если точность опущена, то считается, что она равна 6; если точность равна нулю, точка не печатается. |
e, E | Выводимое значение типов float или double преобразуется в десятичное число и изображается в виде [-]d.ddde+/-dd, где перед точкой находится ровно одна цифра, а число цифр после точки определяется точностью; по умолчанию точность равна 6; если точность равна нулю, точка не печатается. Спецификация E отличается от e только обозначением порядка (E вместо e). Порядок всегда содержит по крайней мере две цифры. |
g, G | Выводимое значение типов float или double преобразуется в десятичное число и изображается либо в формате f, либо в формате e (или E, если задана спецификация G); точность определяется числом значащих цифр. Вид изображения зависит от значения аргумента: вид e используется только в том случае, если порядок меньше -4 или больше значения точности. Хвостовые незначащие нули подавляются; десятичная точка печатается, только если за ней есть цифры. |
c | Печатается значение-символ. |
s | Выводимое значение, заданное указателем, рассматривается как цепочка символов, ограниченная пустым символом (\0); печать цепочки прекращается либо по ограничителю, либо после вывода количества символов, равного значению точности. По умолчанию точность считается бесконечно большой; в этом случае цепочка печатается до тех пор, пока не встретится ограничитель. Пустой указатель (NULL) дает непредсказуемые результаты. |
% | Печать символа %; выводимых значений не требуется. |
Если порядок вещественного числа точкой равен 0x7FF, то число изображается в виде
[-]NaN0xddddddddгде 0xdddddddd - шестнадцатеричное представление старших 32 бит мантиссы.
Изображение результата никогда не усекается до заданной ширины поля; если результат не помещается в поле, то оно расширяется до требуемой величины. Функции printf и fprintf выдают символы так, как если бы вызывалась функция putc(3S).
ПРИМЕРЫ
char*t="char*t=%c%s%c;main(){char q=%d; printf(t,q,t,q,q);}"; main(){char q=34;printf(t,q,t,q,q);}
Разобраться в этой программе предоставляется читателю. Отметим только, что в обращении к функции printf первое вхождение t задает формат, а второе трактуется как обычное выводимое значение. Формат содержит как обычные символы, которые выводятся без изменений, так и спецификаторы преобразований.
printf("pi = %.5f", 4*atan(1.0));