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 направляет данные в стандартный поток вывода stdout. Функция 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).@