PRINTF(3S) PRINTF(3S)
НАЗВАНИЕ
printf, fprintf, sprintf - вывод с преобразованием по
формату
СИНТАКСИС
#include
int printf (format, val ...)
char *format;
int fprintf (stream, format, val ...)
FILE *stream;
char *format;
int sprintf (s, format [, val] ...)
char *s, *format;
ОПИСАНИЕ
Функция printf направляет данные в стандартный поток
вывода stdin. Функция fprintf направляет данные в поток
вывода, заданный аргументом stream. Функция sprintf
направляет данные, заканчивающиеся пустым символом
(\0), в массив s; пользователь должен позаботиться о
выделении достаточного количества памяти для массива.
Каждая функция возвращает число переданных символов (не
считая пустого в случае sprintf), или отрицательное
число, если при выводе обнаружилась ошибка.
Каждая из перечисленных функций преобразует, форматиру-
ет и печатает выводимые значения val под управлением
формата, заданного аргументом format. Формат - это це-
почка символов, содержащая объекты двух категорий:
обычные символы, которые просто копируются в выходной
поток, и спецификаторы преобразований, каждому из кото-
рых соответствует одно, несколько или ни одного из вы-
водимых значений. Если выводимых значений val недоста-
точно, результат непредсказуем; если их слишком много,
избыточные игнорируются.
Каждый спецификатор преобразования начинается символом
%, после которого последовательно записываются:
1. Флаги (один, несколько или ни одного), которые
уточняют смысл спецификации преобразования.
2. Необязательная последовательность десятичных цифр,
задающая минимальную ширину поля, в котором изоб-
ражается результат преобразования. Если результат
может быть изображен меньшим количеством символов,
то поле дополняется слева (или справа, если задан
флаг выравнивания по левой границе) пробелами до
минимальной ширины; если последовательность, зада-
ющая ширину поля, начинается нулем, то для допол-
нения используются нули.
3. Точность, задающая минимальное количество цифр в
изображении результата преобразования типа d, i,
o, u, x, X, количество цифр после десятичной точки
в изображении результата преобразования типа e, E,
f, максимальное количество значащих цифр в изобра-
жении результата преобразования типа g, G, или
максимальное количество символов в изображении ре-
зультата преобразования типа s. Точность записыва-
ется в виде точки (.), за которой следует несколь-
ко десятичных цифр; отсутствие цифр интерпретиру-
ется как ноль. Дополнение результата символами,
обусловленное точностью, подавляет дополнение,
обусловленное шириной поля.
4. Необязательный символ l, означающий, что относящи-
еся к нему преобразования d, i, o, u, x, X приме-
няются к целым выводимым значениям типа long. Для
остальных преобразований символ l игнорируется.
5. Символ, обозначающий тип преобразования.
Вместо последовательности цифр ширину поля и точность
можно обозначить звездочкой. Это означает, что в ка-
честве ширины поля (или точности) используется целое
значение 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).
ПРИМЕРЫ
1. Программа, печатающая свой текст (она должна быть
набрана на одной строке):
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 задает формат, а второе трактуется как
обычное выводимое значение. Формат содержит как обычные
символы, которые выводятся без изменений, так и специ-
фикаторы преобразований.
2. Напечатать число "pi" с пятью десятичными знаками:
printf("pi = %.5f", 4*atan(1.0));
СМ. ТАКЖЕ
ecvt(3C), putc(3S), scanf(3S), stdio(3S).
|