Функция Производит форматированный вывод в 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.
Смотрите также cprintfecvtfprintffreadfscanfputcputsputwscanfsprintfvprintfvsprintf
Пример:
#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<2; i++){
for (j=0; j<2; j++)
for (k=0; k<2; k++)
for (l=0; l<2; l++)
{
if (i==0) strcat(prefix,"-");
if (j==0) strcat(prefix,"+");
if (k==0) strcat(prefix,"%");
if (l==0) strcat(prefix,"0");
printf("%5s !",prefix);
strcpy(tp, prefix);
strcat(tp, "6d !");
printf(tp, I);
strcpy(tp,"");
strcpy(tp, prefix);
strcat(tp, "6o !");
printf(tp, I);
strcpy(tp,"");
strcpy(tp,prefix);
stpcat(tp, "8x !");
printf(tp,I);
stpcry(tp,"");
stpcry(tp, prefix);
strcat(tp, "10.2e !");
printf(tp, R);
strcpy(tp, prefix);
strcat(tp, "10.2f !");
printf(tp,R);
printf(" \n");
stpcry(prefix, "%");
}
}
}
prefix 6d 6o 8x 10.2e 10.2f
%-+#0 !+00555 !01053 !0x0022b !+5.50e+000 !+000005.50 !
%-+# !+555 !01053 !0x22b !+5.50e+000 !+5.50 !
%-+0 !+00555 !01053 !000022b !+5.50e+000 !+000005.50 !
%-+ !+555 !1053 !22b !+5.50e+000 !+5.50 !
%-#0 !000555 !001053 !0x00022b !05.50e+000 !0000005.50 !
%-# !555 !01053 !0x22b !5.50e+000 !5.50 !
%-0 !000555 !001053 !0000022b !05.50e+000 !0000005.50 !
%- !555 !1053 !22b !5.50e+000 !5.50 !
%+#0 !+00555 ! 01053 ! 0x0022b !+5.50e+000 !+000005.50 !
%+# ! +555 ! 01053 ! 0x22b !+5.50e+000 ! +5.50 !
%+0 !+00555 ! 01053 ! 000022b !+5.50e+000 !+000005.50 !
%+ ! +555 ! 1053 ! 22b !+5.50e+000 ! +5.50 !
%#0 !000555 !001053 !0x00022b !05.50e+000 !0000005.50 !
%# ! 555 ! 01053 ! 0x22b ! 5.50e+000 ! 5.50 !
%0 !000555 !001053 !0000022b !05.50e+000 !0000005.50 !
% ! 555 ! 1053 ! 22b ! 5.50e+000 ! 5.50 !