Printf
printf
Функция Производит форматированный вывод в stdout.
Синтаксис #include
int printf(const char *format [,argument, ...]);
Файл, содержащий stdio.h прототип
Описание printf получает набор аргументов, применяет к каж- дому соответствующую спецификацию формата из строки format, и выводит форматированные данные в stdout. Число аргументов должно соответствовать числу спецификаций формата в format.
Строка формата.
Строка формата, представленная в каждом вызове функций семейства ...printf, управляет тем, как каждая из функций будет преобразовывать, формати- ровать и печатать свои аргументы. Для формата должно быть достаточно аргументов, иначе резуль- таты могут быть непредвиденными, и, скорее всего, неверными. Лишние аргументы (если их количество больше, чем требуется в формате) будут игнориро- ваться.
Строка формата - это символьная строка, состоящая из двух типов объектов - просто символы и специ- фикации преобразования.
- Простые символы переносятся в вывод без измене- ний.
- Спецификации преобразования применяются для форматирования.
Спецификации формата.
Спецификации формата для функций семейства ... printf имеют следующую форму:
%[флаги] [ширина] [.точность] [F|N|h|l|L] type Каждая спецификация начинается с символа процента (%). После процента следуют признаки в порядке:
- необязательная последовательность [flags] сим- волов-флагов;
- необязательная спецификация [width] ширины;
- необязательная спецификация [.prec] точности;
- необязательный модификатор [F|N|h|l|L] входного размера;
- символ типа преобразования [type].
Необязательные компоненты строки формата.
Далее описаны основные правила управления форма- том, включая необязательные символы, спецификации и модификации для форматной строки.
-----------------T--------------------------------------------------- Символ или ¦ Как они управляют форматом спецификация ¦ -----------------+--------------------------------------------------- flags (флажки) ¦ выравнивание вывода, знак числа, десятичная ¦ точка, хвостовые нули, восьмеричные и десятичные ¦ префиксы. ¦ width (ширина) ¦ максимальное число печатаемых символов, включая ¦ пробелы и нули. ¦ precision ¦ максимальное число печатаемых символов; для целых (точность) ¦ чисел максимальное число цифр. ¦ size (размер) ¦ отвергает размер аргумента по умолчанию ¦ (N- ближний указатель, F- дальний указатель, ¦ h- короткое целое, l- длинное целое, L - long ¦ double). -----------------+---------------------------------------------------
Символы преобразования для семейства функций ...printf.
В следующей таблице дается список типов преобра- зований, входной тип аргумента и выходной тип после преобразования.
Информация, представленная в данной таблице пред- полагает, что в формате отсутствуют кроме типа преобразования, все остальные характеристики: флажки, ширина, точность, размер. Чтобы увидеть, как влияет на вывод добавления к формату какого- либо необязательного спецификатора, смотрите таб- лицу, следующую за данной.
--------------T------------T----------------------------------------- Символ ¦ Входной ¦ Выходной аргумент преобразования¦ аргумент ¦ --------------+------------+----------------------------------------- числовые данные --------------T------------T----------------------------------------- d ¦ целое ¦ целое десятичное со знаком i ¦ целое ¦ целое десятичное со знаком o ¦ целое ¦ целое восьмеричное без знака u ¦ целое ¦ целое десятичное без знака x ¦ целое ¦ целое шестнадцатеричное без знака ¦ ¦ (с буквами a, b, c, d, e, f) X ¦ целое ¦ целое шестнадцатеричное без знака ¦ ¦ (с буквами A, B, C, D, E, F). f ¦с плавающей ¦ значение со знаком в форме [-]dddd. ¦ точкой ¦ dddd e ¦с плавающей ¦ значение со знаком в форме [-]d.dddd ¦ точкой ¦ e[+/-]ddd g ¦с плавающей ¦ значение со знаком либо в форме f, либо ¦ точкой ¦ в форме e, с данным значением и точнос- ¦ ¦ тью. Хвостовые нули и десятичная точка ¦ ¦ печатаются только при необходимости E ¦с плавающей ¦ так же, как в случае e, только с буквой ¦ точкой ¦ E для обозначения степени G ¦с плавающей ¦ так же, как в случае g, только с буквой ¦ точкой ¦ E для обозначения степени --------------+------------+----------------------------------------- Символьные данные. --------------T------------T----------------------------------------- C ¦ символьное ¦ один символ S ¦ указатель ¦ печатает символы до тех пор, пока не ¦ на строку ¦ встретится нулевое окончание, либо не ¦ ¦ будет достигнута точность. % ¦ нет символа¦ печатается только знак %. --------------+------------+----------------------------------------- Указатели --------------T------------T----------------------------------------- n ¦ указатель ¦ сохраняется (по адресу, указанному во ¦ на целое ¦ входном аргументе) кол-во только что за- ¦ ¦ писанных символов. P ¦ указатель ¦ печатает входной аргумент,как указатель; ¦ ¦ дальние указатели печатаются, как ¦ ¦ XXXX:YYYY, ближние указатели печатаются, ¦ ¦ как YYYY (только смещение). --------------+------------+-----------------------------------------
Соглашения.
В нижеследующей таблице перечислены некоторые соглашения, сопровождающие данные спецификации.
------------T-------------------------------------------------------- Символы ¦ Соглашения ------------+-------------------------------------------------------- e или E ¦ аргумент преобразуется в соответствии с шаблоном: ¦ [-]d.ddd...e[+/-]ddd, где ¦ - одна цифра предшествует десятичной точке; ¦ - число цифр после десятичной точки равно точности; ¦ - степень всегда содержит три цифры. f ¦ аргумент преобразуется в десятичную форму в соответст- ¦ вии с шаблоном [-]ddd.ddd..., где число десятичных ¦ цифр после запятой равно точности (если дана ненулевая ¦ точность). g или G ¦ аргумент печатается по принципу e, E или f, с точнос- ¦ тью, обозначающей число значащих цифр. ¦ Хвостовые нули удаляются, десятичная точка ставится ¦ только при необходимости. ¦ аргумент печатается по принципу e или f (с некоторыми ¦ ограничениями), если символ преобразования g; и по ¦ принципу E, если символ преобразования G. ¦ Принцип e используется только в том случае, если экспо- ¦ нента, полученная в результате либо а) больше, чем точ- ¦ ность; б) меньше чем -4. x или X ¦ Для преобразований типа x - в выводе будут буквы a, b, ¦ c, d, e. ¦ Для преобразований типа X - в выводе будут буквы A, B, ¦ C, D, E. ------------+---------------------------------------------------------
Замечание. Неопределенные значения с плавающей точкой печатаются как +INF или -INF. Не числа по IEEE печатаются как +NAN или -NAN.
Символы - флаги.
Символы - флажки это минус(-), плюс(+), диез(#) и пусто( ); Они могут появляться в любом порядке и комбинации.
-----------T--------------------------------------------------------- Флаг ¦ Что это означает -----------+--------------------------------------------------------- - ¦ Левое выравнивание результата, пробелы остаются справа. ¦ Если не задан, результат выравнивается справа, заполня- ¦ ется пробелами или нулями слева. + ¦ Знаковое преобразование - результат всегда начинается со ¦ знака (+) или (-). пусто ¦ Если значение неотрицательно, вывод начинается с пробе- ¦ ла вместо плюса; отрицательные значения всегда начина- ¦ ются со знака минус. # ¦ Специфицирует, что преобразуемый аргумент используется в ¦ "альтернативной" форме. Смотрите следующую таблицу. -----------+---------------------------------------------------------
Примечание. Знак плюс имеет приоритет над пробе- лом в обоих случаях.
Альтернативная форма.
Если флаг # используется вместе с символом преоб- разования, при конвертировании аргумента (arg) это даст следующий результат:
------------------T-------------------------------------------------- Символ ¦ Как # влияет на результат преобразования ¦ ------------------+-------------------------------------------------- c, s, d, i, u ¦ Не оказывает влияния. 0 ¦ 0 предшествует ненулевому arg x или X ¦ 0x (или 0X) предшествует arg e, E или f ¦ Результат всегда будет содержать десятичную точ- ¦ ку, даже если за точкой не следует никаких цифр. ¦ Обычно, десятичная точка появляется в результате, ¦ только если за ней следует цифра. g или G ¦ Аналогично e или E, с дополнением, что хвостовые ¦ нули не удаляются. ------------------+--------------------------------------------------
Спецификация ширины.
Спецификация ширины устанавливает минимальную ши- рину поля для выводимого значения.
Ширина задается одним из двух способов:
- непосредственно, с помощью строки десятичных цифр;
- или косвенно с помощью знаков (*).
Если вы используете звездочку (*) для специфика- ции ширины, следующий аргумент в вызове функции (который должен быть целым) определяет минималь- ную ширину выводного поля. Не существующая или недостаточная ширина поля ни в коем случае не приведет к усечению поля. Если результат шире, чем объявленная ширина поля, поле будет просто продолжено до необходимой ширины.
--------------T------------------------------------------------------ Спецификация ¦ Как это влияет на ширину вывода ширины ¦ --------------+------------------------------------------------------ n ¦ Печатаются по крайней мере n символов. Если выводи- ¦ мое значение меньше, чем n символов, вывод заполня- ¦ ется пробелами (выравнивание справа, если задан флаг ¦ "-", в противном случае - левое выравнивание). 0n ¦ Печатается по крайней мере n символов. Если выводное ¦ значение содержит менее n символов, оно заполняется ¦ слева нулями. * ¦ Спецификация ширины ставится в списке аргументов ¦ перед соответствующим аргументом. --------------+------------------------------------------------------
Спецификация точности.
Спецификация точности всегда начинается с точки (.), отделяющей ее от предшествующей спецификации ширины. Затем спецификация точности также, как и ширины, задается либо непосредственно, с помощью строки десятичных цифр, либо косвенно - с помощью знака звездочки (*). Если для спецификации точ- ности используется звездочка (*), следующий аргу- мент в вызове функции (обязательно целый) опреде- ляет точность.
Если вы используете звездочки для задания точнос- ти или ширины, или для обеих спецификаций, аргу- мент должен следовать непосредственно за соответ- ствующим спецификатором.
---------------T----------------------------------------------------- Спецификация ¦ Как это влияет на вывод точности ¦ ---------------+----------------------------------------------------- (не дана) ¦ Точность устанавливается по умолчанию (стандартно ¦ =1 для типов d, i, o, u, x, X; ¦ =6 для типов e, E, f; ¦ = все значащие цифры для типов g, G; ¦ = печать первого нулевого символа для типа S; ¦ не влияет на тип c) .0 ¦ Для типов d, i, o, u, x точность устанавливается по ¦ умолчанию. ¦ Для типов e, E, f десятичная точка не печатается. .n ¦ Печатаются n символов или n десятичных знаков; если ¦ выводимое значение содержит больше n символов, оно ¦ может быть усечено или округлено. (Случится это или ¦ нет, зависит от символьного типа). * ¦ Спецификация точности задается в списке аргументов, ¦ причем она предшествует значению форматируемого ар- ¦ гумента. ---------------+-----------------------------------------------------
Замечание. Если указана нулевая точность, и спецификатор формата для целого значения (т.е. d, i, o, u, x), и печатаемое значение равно 0, то в этом случае не будут выводится цифровые символы, т.е. поле бу- дет пустое.
---------------T----------------------------------------------------- Символ ¦ Как спецификация точности влияет на преобразование преобразования ¦ ---------------+----------------------------------------------------- d ¦ .n показывает, что будет напечатано по крайней мере i ¦ n цифр. Если выводимый аргумент имеет менее n цифр, o ¦ свободные места в выводе забиваются слева нулями. u ¦ Если же выводимый аргумент имеет больше n цифр, вы- x ¦ ходное значение не усекается. X ¦ ¦ e ¦ .n показывает, что после десятичной точки будет на- E ¦ печатано n символов, причем последняя цифра округ- f ¦ ляется. ¦ g ¦ .n определяет, что будет напечатано максимально n ¦ значащих цифр. G ¦ ¦ c ¦ .n не имеет влияния на вывод ¦ s ¦ .n определяет, что будет напечатано не больше, чем ¦ n символов. ---------------+-----------------------------------------------------
Модификатор входного размера.
Символ - модификатор входного размера (F, N, h, l или L) дает размер последующего входного аргумен- та:
F = дальний указатель; N = ближний указатель; h = короткое целое; l = длинное целое; L = длинное двойной точности;
Модификаторы входного размера (F, N, h, l и L) влияют на то, каким образом функции ...printf ин- терпретируют тип данных соответствующего входного аргумента arg. Модификаторы F и N применяются только к тем входным аргументам arg, которые представляют собой указатели (%p, %s и %n). Моди- фикаторы h, l и L применяются к числовым аргумен- там (целые и с плавающей точкой).
Оба модификатора F и N интерпретируют входной ар- гумент arg. Обычно, для преобразований %p, %s, или %n аргумент arg - это указатель стандартного размера для соответствующей модели памяти. F оз- начает: "интерпретировать arg, как дальний указа- тель". N означает: "интепретировать arg, как ближний указатель".
Модификаторы h, l и L отвергают стандартный раз- мер числовых данных входных аргументов: l и L применяется к целым типам данных (d, i, o, u, x, X) и типам данных с плавающей точкой (e, E, f, g и G), в то время как h применяется только к целым данным. Ни h, ни l- модификаторы не оказывают ни- какого влияния на типы символов(c,s) или указате- лей(p,n).
------------------T-------------------------------------------------- Модификаторы ¦ Как интерпретируется аргумент входного размера ¦ ------------------+-------------------------------------------------- F ¦ аргумент arg читается, как дальний указатель. N ¦ аргумент arg читается, как ближний указатель. ¦ в сверх-больших моделях памяти N не может ис- ¦ пользоваться ни с каким типом преобразований. h ¦ для типов преобразований d, i, o, u, x, X аргумент ¦ arg интерпретируется, как короткое целое; l ¦ для типов преобразований d, i, o, u, x, X аргумент ¦ интерпретируется, как длинное целое; ¦ для типов преобразований e, E, f, g, G аргумент ин- ¦ терпретируется как число двойной точности. L ¦ интерпретирует arg как длинное с двойной точ- ¦ ность для типов преобразований e, E, f, g, G. ------------------+--------------------------------------------------
Возвращаемое Каждая функция возвращает количество выводимых значение байт. В случае ошибки printf возвращает EOF.
Переносимость printf поддерживается на системах UNIX и определена в стандарте Кернигана и Ритчи. Поддерживается стандартом ANSI C.
Смотрите также
Пример:
#define I 555 #define R 5.5
int main(void) { int i, j, k, l; char buf[7]; char *prefix = &buf; char tp[20]; printf("prefix 6d 6o 8x 10.2e 10.2f\n"); strcpy(prefix, "%"); for (i=0; i