Печать в стандартный поток вывода (stdout)
#include <stdio.h>int printf( const char *format,... );
libc
Функция printf() направляет печать символов в стандартынй поток вывода stdout, согласно спецификатору формата.
Если строка формата содержит недопустимые многобайтовые символы, обработка останавливается, и выводится оставшаяся часть форматной строки, включая символы %. Это может произойти, например, если были указаны международные символы и знаки, использующие ISO 8859-1 вместо UTF-8. При вызове:
перед вызовом printf() локаль переключает многобайтовую обработку с UTF-8 на 1-к-1, а printf() корректно передает неправильно сформированные многобайтовые символы. |
Аргументы формата
Если после обработки format остались неучтенные аргументы, они игнорируются.
Семейство функций printf() позволяет использовать символы системы счисления, зависящие от языка. Символ по умолчанию — «.», он управляется LC_NUMERIC
и setlocale().
Управление форматом
Строка управления форматом состоит из:
%
), который не является частью спецификатора преобразования. %
, за которым следует: *
, указывающая минимальную ширину поля ширина поля, которая должна быть зарезервирована для отформатированного элемента .
), за которым следует необязательное десятичное целое число или символ *
h
, hh
, j
, l
, ll
, L
, t
или z
. Флаги управления форматом
Допустимые флаги управления форматом:
+
) в начале у положительных объектов; обычно только у отрицательных элементов отображается знак в начале. +
, и пробел, используется +
. o
(восьмеричное число без знака); если требуется, первый символ выходного потока преобразуется в 0
. x
или X
(шестнадцатеричное число без знака) перед ненулевым значением ставит 0x
или 0X
. e
, E
, f
, g
или G
(любые числа с плавающей запятой) включает в результат символ десятичной точки, даже если за ним не следуют цифры; обычно символ десятичной точки появляется в результате только в том случае, если за ним следует цифра. g
и G
оставляют завершающие нули в результате. d
, i
, o
, u
, x
, X
, e
, E
, f
, g
и G
преобразований. Флаг «-» переопределяет этот флаг. Ширина поля
Если не была указана ширина поля или заданное значение меньше числа символов в преобразованном значении (с учетом любого значения точности), используется поле достаточной ширины, чтобы содержать преобразованное значение.
Если преобразованное значение содержит меньше символов, чем указано шириной поля, значение дополняется слева (или справа, в зависимости от флага выравнивания по левому краю) пробелами или нулевыми символами (0
). Если ширина поля начинается с нуля, значение дополняется нулями; в противном случае значение дополняется пробелами.
Если ширина поля равна *
(или 0*
), значение типа int
из списка аргументов используется (перед аргументом точности или аргументом преобразования) в качестве минимальной ширины поля. Отрицательное значение ширины поля интерпретируется как флаг выравнивания по левому краю, за которым следует положительное значение ширины поля.
Спецификатор точности
Как и в случае со спецификатором ширины поля, спецификатор точности *
приводит к использованию значения типа int из списка аргументов в качестве спецификатора точности. Если был задан спецификатор точности *
, но в списке аргументов нет значения точности, используется точность 0
.
Значение точности влияет на следующие преобразования:
d
, i
, o
, u
, x
и X
(целое число) точность определяет минимальное количество цифр, которые должны выводиться.
e
, E
и f
(числа с плавающей запятой и с фиксированной точностью) точность определяет количество отображаемых цифр после десятичной точки.
g
и G
( числа с плавающей запятой и переменной точностью) точность определяет максимальное количество отображаемых значащих цифр.
s
(строка) точность определяет максимальное количество отображаемых символов. Спецификатор длины типа
Спецификатор длины типа влияет на преобразование следующим образом:
h
устанавливает для целых преобразователей d
, i
, o
, u
, x
или X
соответствие аргументам short int
или unsigned short int
. Несмотря на то, что аргумент может быть иметь тип int
как часть вызова функции,значение преобразуется в меньший тип перед форматированием.
h
выполняет операцию n
(присвоение преобразованной длины), присваивая преобразованную длину объекту типа short
.
hh
аналогичен h
, но обрабатывает аргумент как signed char
или unsigned char
.
j
приводит к соответствию преобразователей d
, i
, o
, u
, x
, X
аргументу intmax_t
или uintmax_t
.
j
выполняет операцию n
(присвоение преобразованной длины) для intmax_t
.
L
приводит типы преобразования a
, A
, e
, E
, f
, F
, g
или G
(double) к соответствию аргументу long double
.
l
приводит тип преобразования c
к соответствию аргументу wint_t.
l
приводит тип преобразования s
к соответствию аргументу wchar_t
argument.
l
приводит типы преобразований d
, i
, o
, u
, x
или X
(целое число) к соответствию аргументам типа long
или unsigned long
.
l
выполняет операцию n
(присвоение преобразованной длины), присваивая преобразованную длину объекту типа long
.
ll
выполняет преобразование типов d
, i
, o
, u
, x
или X
(целое число) к аргументам типа long long
или unsigned long long
.
ll
выполняет операцию n
(присвоение преобразованной длины), присваивая количество прочитанных символов объекту типа long long int
.
t
вызывает преобразование формата для типов d
, i
, o
, u
, x
, X
для обработки ptrdiff_t
или соответствующего аргумента типа unsigned
.
t
выполняет операцию n
для аргумента ptrdiff_t
.
z
устанавливает для целых преобразователей d
, i
, o
, u
, x
, X
соответствие аргументу size_t
.
z
выполняет операцию n
для аргумента size_t
. Спецификаторы типа преобразования
Допустимые спецификаторы типа преобразования:
double
в стиль [-]0xh.hhhh p1d
, где перед десятичной точкой стоит одна ненулевая шестнадцатеричная цифра. Количество шестнадцатеричных цифр после запятой равно точности. Если точность не задана, а FLT_RADIX
является степенью 2
, то точность достаточна для представления. Если точность равна нулю и не был указан флаг #
, десятичная точка не отображается. Преобразование a
использует буквы abcdef
и производит преобразование x
и p
; преобразование A
в ABCDEF
, X
и P
. Показатель степени всегда имеет одну цифру, даже если это 0
, и не больше цифр, чем необходимо. Значения бесконечности или NaN
преобразуются в стиле f
или F
. int
в значение типа unsigned
char
и запись соответствующего кода символа ASCII в поток вывода. Квалификатор l
приводит к преобразованию аргумента wint_t
, как если бы посредством преобразования ls
в wchar_t
, где первым элементом является wint_t
, а вторым является символ нулевой ширины. int
в десятичную запись со знаком и записывает его в поток вывода. Точность по умолчанию — 1
, но если требуется больше цифр, добавляются нули в начале. double
в десятичную запись вида [-]d.ddde[+|-]dd
. Начальный знак появляется (с учетом флагов управления форматом) только в том случае, если аргумент отрицательный. Если аргумент не равен нулю, цифра перед символом десятичной точки не равна нулю. Точность используется как количество цифр после символа десятичной точки. Если точность не указана, используется точность по умолчанию, равная шести. Если точность равна 0
, символ десятичной точки подавляется. Значение округляется до соответствующего количества цифр. Знак экспоненты и показатель степени (указывающий степень десяти, на которую умножается десятичная дробь) выводятся всегда. Показатель степени имеет длину не менее двух цифр и имеет столько дополнительных цифр, сколько необходимо для его представления. Если значение равно нулю, показатель степени равен нулю. Для преобразования E
показатель степени начинается с символа E
, а не с e
. Аргументы бесконечности или NaN
преобразуются в стиле спецификаторов преобразования f
или F
. [-]ddd.ddd
с количеством цифр после запятой, равным спецификатору точности. Начальный знак появляется (с учетом флагов управления форматом) только в том случае, если аргумент отрицательный. Точность используется как количество цифр после символа десятичной точки. Если точность не указана, используется точность по умолчанию, равная шести. Если точность равна 0
, символ десятичной точки подавляется; в противном случае перед символом десятичной точки выводится по крайней мере одна цифра. Значение округляется до соответствующего количества цифр. Аргумент типа double
, представляющий бесконечность или NaN
, преобразуется в [-]inf
или [-]nan
. Спецификатор F
преобразуется [-]INF
или [-]NAN
. e
или f
(или E
для преобразования G
), в зависимости от значения аргумента. В любом из случаев точность определяет количество значащих цифр, содержащихся в результате. Преобразование в стиле e
используется только в том случае, если показатель степени такого преобразования будет меньше, чем -4
, или больше, чем точность. Нули в конце удаляются из результата, а символ десятичной точки появляется только в том случае, если за ним следует цифра. Аргументы, представляющие бесконечность или NaN
, преобразуются в стиле спецификаторов преобразования f
или F
. unsigned
в восьмеричное представление без знака и запись его в поток вывода. Точность по умолчанию — 1
, но если требуется больше цифр, добавляются нули в начале. void *
в значение типа int
и форматирование значения как для шестнадцатеричного (x
) преобразования. char *
, вплоть до завершающего символа NUL
('\0'), но не включая его, в поток вывода. Если указана точность, то будет записано не более указанного количества символов. Если используется квалификатор l
, аргумент интерпретируется как указатель на массив wchar_t
, и каждый символ, включая завершающий NUL
, преобразуется, как если бы он был вызван вызовом wcrtomb(). Завершающий NUL
пишется только в том случае, если точность не указана или если точность указана, а длина последовательности символов меньше точности. unsigned
в беззнаковую десятичную запись и записывает его в поток вывода. Точность по умолчанию — 1
, но если требуется больше цифр, добавляются нули в начале. unsigned
в шестнадцатеричное представление без знака и запись его в поток вывода. Точность по умолчанию — 1
, но если требуется больше цифр, добавляются нули в начале. Шестнадцатеричная запись использует цифры от 0
до 9
и символы от a
до f
или от A
до F
для преобразования x
или X
, соответственно, в качестве шестнадцатеричных цифр. В зависимости от контрольного флага перед выводом добавляется 0x
или 0X
. %
(%%
для полной спецификации). Любой другой символ спецификатора типа преобразования, включая другой символ процента (%
), записывается в выходной поток без специальной интерпретации.
Аргументы должны соответствовать спецификаторам типа преобразования слева направо в строке; в противном случае будут получены неопределенные результаты.
Если значение, соответствующее спецификатору с плавающей запятой, равно бесконечности или не является числом (NAN
), тогда вывод будет inf
или -inf
для бесконечности и nan
или -nan
для NAN.
Например, спецификатор формы %8.*f
определяет поле шириной не менее 8
символов и получает следующий аргумент для точности, которая будет использоваться при преобразовании.
NULL
#include <stdio.h>#include <stdlib.h>int main( void ){char *weekday, *month;weekday = "Saturday";month = "April";printf( "%s, %s %d, %d\n", weekday, month, 10, 1999 );printf( "f1 = %8.4f f2 = %10.2E x = %#08x i = %d\n",23.45, 3141.5926, 0x1db, -1 );return (EXIT_SUCCESS);}
Код генерирует следующий вывод:
$ ./a.out Saturday, April 10, 1999 f1 = 23.4500 f2 = 3.14E+003 x = 0x0001db i = -1
ANSI, POSIX 1003.1
errno, fprintf(), fwprintf(), snprintf(), sprintf(), swprintf(), vfprintf(), vfwprintf(), vprintf(), vsnprintf(), vsprintf(), vswprintf(), vwprintf(), wprintf()
Предыдущий раздел: Описание API системной библиотеки