Синтаксис описания формата: функции printf и wprintfFormat specification syntax: printf and wprintf functions

Различные функции printf и wprintf принимают строку формата и необязательные аргументы и создают форматированную последовательность символов для выходных данных.The various printf and wprintf functions take a format string and optional arguments and produce a formatted sequence of characters for output. Строка формата не содержит ни одной или содержит несколько директив, которые являются либо литеральными символами для выходных данных, либо закодированными спецификациями преобразования, описывающими способ форматирования аргумента в выходных данных.The format string contains zero or more directives, which are either literal characters for output or encoded conversion specifications that describe how to format an argument in the output. Эта статья описывает синтаксис для кодирования спецификаций преобразования в строке формата.This article describes the syntax used to encode conversion specifications in the format string. Список этих функций см. в разделе Потоковый ввод-вывод.For a listing of these functions, see Stream I/O.

Спецификация преобразования состоит из необязательных и обязательных полей, имеющих следующий вид:A conversion specification consists of optional and required fields in this form:

% [flags][width][.precision][size]type%[flags][width][.precision][size]type

Каждое поле спецификации преобразования — это символ или число, указывающее конкретный параметр формата или описатель преобразования.Each field of the conversion specification is a character or a number that signifies a particular format option or conversion specifier. Обязательное поле type определяет тип преобразования, которое применяется к аргументу.The required type field specifies the kind of conversion to be applied to an argument. Необязательные поля flags, width и precision управляют дополнительными аспектами формата, такими как начальные пробелы или нули, выравнивание и отображаемая точность.The optional flags, width, and precision fields control additional format aspects such as leading spaces or zeroes, justification, and displayed precision. Поле size указывает размер использованного и преобразованного аргумента.The size field specifies the size of the argument consumed and converted.

Базовая спецификация преобразования содержит только символ процента и символ type.A basic conversion specification contains only the percent sign and a type character. Например, %s определяет преобразование строк.For example, %s specifies a string conversion. Чтобы вывести символ знака процента, используйте %%.To print a percent-sign character, use %%. Если за символом процента следует символ, который не имеет смысла в поле формата, вызывается обработчик недопустимого параметра.If a percent sign is followed by a character that has no meaning as a format field, the invalid parameter handler is invoked. Дополнительные сведения см. в разделе Проверка параметров.For more information, see Parameter Validation.

Важно!

Для обеспечения безопасности и стабильности убедитесь, что строки спецификации преобразования не определяются пользователем.For security and stability, ensure that conversion specification strings are not user-defined. Например, рассмотрим программу, которая предлагает пользователю ввести имя и сохраняет введенные данные в строковой переменной с именем user_name.For example, consider a program that prompts the user to enter a name and stores the input in a string variable that's named user_name. Для печати переменной user_name не используйте следующий код:To print user_name, do not do this:

printf( user_name ); /* Danger! If user_name contains "%s", program will crash */

Вместо этого используйте следующий код:Instead, do this:

printf( "%s", user_name );

Спецификатор преобразования типовType conversion specifier

Символ спецификации преобразования type определяет, как должен интерпретироваться соответствующий аргумент: как символ, строка, указатель, целое число или число с плавающей запятой.The type conversion specifier character specifies whether to interpret the corresponding argument as a character, a string, a pointer, an integer, or a floating-point number. Символ type — единственное обязательное поле спецификации преобразования; он указывается после всех необязательных полей.The type character is the only required conversion specification field, and it appears after any optional fields.

Аргументы, которые следуют за строкой формата, интерпретируются согласно соответствующему символу type и необязательному префиксу size.The arguments that follow the format string are interpreted according to the corresponding type character and the optional size prefix. Преобразования для символьных типов char и wchar_t определяются с помощью символов c или C; однобайтовые и многобайтовые строки или строки с расширенными символами указываются с помощью символа s или S, в зависимости от используемой функции форматирования.Conversions for character types char and wchar_t are specified by using c or C, and single-byte and multi-byte or wide character strings are specified by using s or S, depending on which formatting function is being used. Символьные и строковые аргументы, указанные с использованием c и s, интерпретируется как char и char* функциями семейства printf или как wchar_t и wchar_t* функциями семейства wprintf.Character and string arguments that are specified by using c and s are interpreted as char and char* by printf family functions, or as wchar_t and wchar_t* by wprintf family functions. Символьные и строковые аргументы, указанные с использованием C и S, интерпретируется как wchar_t и wchar_t* функциями семейства printf или как char и char* функциями семейства wprintf.Character and string arguments that are specified by using C and S are interpreted as wchar_t and wchar_t* by printf family functions, or as char and char* by wprintf family functions. Такое поведение относится только к системам Майкрософт.This behavior is Microsoft specific.

Целочисленные типы, такие как short, int, long, long long и их варианты unsigned указываются с помощью символов d, i, o, u, x и X. Типы с плавающей запятой, такие как float, double и long double, указываются с помощью символов a, A, e, E, f, F, g и G. По умолчанию, если не применяется префикс поля size, целочисленные аргументы приводятся к типу int, а аргументы с плавающей запятой приводятся к типу double.Integer types such as short, int, long, long long, and their unsigned variants, are specified by using d, i, o, u, x, and X. Floating-point types such as float, double, and long double, are specified by using a, A, e, E, f, F, g, and G. By default, unless they are modified by a size prefix, integer arguments are coerced to int type, and floating-point arguments are coerced to double. В 64-разрядных системах тип int является 32-разрядным значением; поэтому 64-разрядные целые числа будут усекаться при форматировании для вывода, если не используется префикс size со значением ll или I64.On 64-bit systems, an int is a 32-bit value; therefore, 64-bit integers will be truncated when they are formatted for output unless a size prefix of ll or I64 is used. Для типов указателей, которые указываются с помощью символаp, используется размер указателя по умолчанию для платформы.Pointer types that are specified by p use the default pointer size for the platform.

Примечание

Относится только к системам Майкрософт. Символ типа Z, а также поведение символов типа c, C, s и S при использовании с функциями printf и wprintf представляют собой расширения Майкрософт.Microsoft Specific The Z type character, and the behavior of the c, C, s, and S type characters when they are used with the printf and wprintf functions, are Microsoft extensions. C стандарта ISO постоянно использует c и s для узких символов и строк, и C и S — для расширенных символов и строк во всех функциях форматирования.The ISO C standard uses c and s consistently for narrow characters and strings, and C and S for wide characters and strings, in all formatting functions.

Символы поля типаType field characters

Символ типаType character АргументArgument Формат выводаOutput format
cc ЗнакCharacter При использовании с функциями printf определяет однобайтовый символ; при использовании с функциями wprintf определяет расширенный символ.When used with printf functions, specifies a single-byte character; when used with wprintf functions, specifies a wide character.
CC ЗнакCharacter При использовании с функциями printf определяет расширенный символ; при использовании с функциями wprintf определяет однобайтовый символ.When used with printf functions, specifies a wide character; when used with wprintf functions, specifies a single-byte character.
dd Целое числоInteger Десятичное целое число со знаком.Signed decimal integer.
ii Целое числоInteger Десятичное целое число со знаком.Signed decimal integer.
oo Целое числоInteger Восьмеричное целое число без знака.Unsigned octal integer.
uu Целое числоInteger Десятичное целое число без знака.Unsigned decimal integer.
xx Целое числоInteger Шестнадцатеричное целое число без знака, используются буквы "abcdef".Unsigned hexadecimal integer; uses "abcdef."
XX Целое числоInteger Шестнадцатеричное целое число без знака, используются буквы "ABCDEF".Unsigned hexadecimal integer; uses "ABCDEF."
ee С плавающей запятойFloating-point Значение со знаком, имеющее формат [-]d.dddddd[d], где d — одна десятичная цифра, dddd — одна или несколько десятичных цифр в зависимости от указанной точности или шесть по умолчанию, dd[d] — две или три десятичные цифры в зависимости от формата вывода и величины экспоненты.Signed value that has the form [-]d.dddddd[d], where d is one decimal digit, dddd is one or more decimal digits depending on the specified precision, or six by default, and dd[d] is two or three decimal digits depending on the output format and size of the exponent.
EE С плавающей запятойFloating-point Аналогичен формату e, за исключением того, что вместо e порядок величины представляет символ E.Identical to the e format except that E rather than e introduces the exponent.
ff С плавающей запятойFloating-point Значение со знаком, имеющее формат [–]dddd . dddd, где dddd — одна или несколько десятичных цифр.Signed value that has the form [-]dddd.dddd, where dddd is one or more decimal digits. Количество цифр перед десятичной запятой зависит от величины числа, а количество знаков после десятичной запятой зависит от указанной точности либо используется шесть по умолчанию.The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision, or six by default.
FF С плавающей запятойFloating-point Идентичен формату f, за исключением того, что выходные данные бесконечности и NaN пишутся прописными буквами.Identical to the f format except that infinity and nan output is capitalized.
gg С плавающей запятойFloating-point Значения со знаком отображаются в формате f или e в зависимости от того, какой формат является более компактным для заданного значения и точности.Signed values are displayed in f or e format, whichever is more compact for the given value and precision. Формат e используется только в том случае, когда порядок значения меньше –4 или больше или равен значению аргумента precision.The e format is used only when the exponent of the value is less than -4 or greater than or equal to the precision argument. Нули в конце отбрасываются, а десятичная запятая отображается только в том случае, если за ней следует хотя бы одна цифра.Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.
GG С плавающей запятойFloating-point Аналогичен формату g, за исключением того, что вместоe порядок величины представляет символ E (где это необходимо).Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).
aa С плавающей запятойFloating-point Шестнадцатеричное значение с плавающей запятой двойной точности со знаком, которое имеет формат [−]0xh.hhhhdd, где h.hhhh — шестнадцатеричные цифры мантиссы (с использованием строчных букв) и dd — одна или более цифр порядка величины.Signed hexadecimal double-precision floating-point value that has the form [-]0xh.hhhhdd, where h.hhhh are the hex digits (using lower case letters) of the mantissa, and dd are one or more digits for the exponent. Точность определяет количество цифр после запятой.The precision specifies the number of digits after the point.
AA С плавающей запятойFloating-point Шестнадцатеричное значение с плавающей запятой двойной точности со знаком, которое имеет формат [−]0Xh.hhhhdd, где h.hhhh — шестнадцатеричные цифры мантиссы (с использованием заглавных букв) и dd — одна или более цифр порядка величины.Signed hexadecimal double-precision floating-point value that has the form [-]0Xh.hhhhdd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. Точность определяет количество цифр после запятой.The precision specifies the number of digits after the point.
nn Указатель на целое числоPointer to integer Число символов, которые успешно записаны на данный момент в поток или буфер.Number of characters that are successfully written so far to the stream or buffer. Это значение хранится в целом числе, адрес которого указан в качестве аргумента.This value is stored in the integer whose address is given as the argument. Размер целочисленного значения, на которое ссылается указатель, управляется префиксом спецификации размера аргумента.The size of the integer pointed at can be controlled by an argument size specification prefix. Спецификатор n отключен по умолчанию. Дополнительные сведения см. в примечании по безопасности.The n specifier is disabled by default; for information see the important security note.
pp Тип указателяPointer type Отображает аргумент как адрес в шестнадцатеричных цифрах.Displays the argument as an address in hexadecimal digits.
ss StringString При использовании с функциями printf определяет строку однобайтовых или многобайтовых символов; при использовании с функциями wprintf определяет строку расширенных символов.When used with printf functions, specifies a single-byte or multi-byte character string; when used with wprintf functions, specifies a wide-character string. Символы отображаются до первого нулевого символа или до тех пор, пока не будет достигнуто значение precision.Characters are displayed up to the first null character or until the precision value is reached.
SS StringString При использовании с функциями printf определяет строку расширенных символов; при использовании с функциями wprintf определяет строку однобайтовых или многобайтовых символов.When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte or multi-byte character string. Символы отображаются до первого нулевого символа или до тех пор, пока не будет достигнуто значение precision.Characters are displayed up to the first null character or until the precision value is reached.
ZZ Структура ANSI_STRING или UNICODE_STRINGANSI_STRING or UNICODE_STRING structure Если в качестве аргумента передается адрес структуры ANSI_STRING или UNICODE_STRING, отображается строка, содержащаяся в буфере, на который указывает поле Buffer структуры.When the address of an ANSI_STRING or UNICODE_STRING structure is passed as the argument, displays the string contained in the buffer pointed to by the Buffer field of the structure. Используйте префикс-модификатор size для w, чтобы указать аргумент UNICODE_STRING, например %wZ.Use a size modifier prefix of w to specify a UNICODE_STRING argument—for example, %wZ. Поле Length структуры должно содержать значение длины строки в байтах.The Length field of the structure must be set to the length, in bytes, of the string. Поле MaximumLength структуры должно содержать значение длины буфера в байтах.The MaximumLength field of the structure must be set to the length, in bytes, of the buffer.

Как правило, символ типа Z используется только в функциях отладки драйвера, которые используют спецификацию преобразования, таких как dbgPrint и kdPrint.Typically, the Z type character is used only in driver debugging functions that use a conversion specification, such as dbgPrint and kdPrint.

Начиная с Visual Studio 2015, если аргумент, соответствующий описателю преобразования с плавающей запятой (a, A, e, E, f, F, g, G), равен бесконечности, не определен или не является числом (NaN), выводится форматированный результат, соответствующий стандарту C99.Starting in Visual Studio 2015, if the argument that corresponds to a floating-point conversion specifier (a, A, e, E, f, F, g, G) is infinite, indefinite, or NaN, the formatted output conforms to the C99 standard. В этой таблице перечислены форматированные выходные данные.This table lists the formatted output:

ЗначениеValue ВыводOutput
infinityinfinity inf
Несигнальное значение NaNQuiet NaN nan
Сигнальное значение NaNSignaling NaN nan(snan)
Неопределенное значение NaNIndefinite NaN nan(ind)

Любое из этих значение может иметь префикс в виде знака.Any of these values may be prefixed by a sign. Если символ описателя преобразования type с плавающей запятой является прописной буквой, выходные данные форматируются также прописными буквами.If a floating-point type conversion specifier character is a capital letter, then the output is also formatted in capital letters. Например, если спецификатором формата является %F вместо %f, бесконечность форматируется как INF вместо inf.For example, if the format specifier is %F instead of %f, an infinity is formatted as INF instead of inf. Функции scanf также могут анализировать эти строки, поэтому эти значения могут совершать круговой путь через функции printf и scanf.The scanf functions can also parse these strings, so these values can make a round trip through printf and scanf functions.

До выхода Visual Studio 2015 в среде CRT использовался другой нестандартный формат для выходных данных значений бесконечности, неопределенных значений и значений NaN.Before Visual Studio 2015, the CRT used a different, non-standard format for output of infinite, indefinite, and NaN values:

ЗначениеValue ВыводOutput
+ бесконечность+ infinity 1.#INF случайные цифры1.#INF random-digits
- infinity- infinity -1.#INF случайные цифры-1.#INF random-digits
Неопределенное (то же, что и не число без вызова исключения)Indefinite (same as quiet NaN) цифра .#IND случайные цифрыdigit .#IND random-digits
NaNNaN цифра .#NAN случайные цифрыdigit .#NAN random-digits

Любое из этих значений могло иметь префикс в виде знака и могло быть отформатировано немного иначе в зависимости от ширины поля и точности (иногда с необычными эффектами).Any of these may have been prefixed by a sign, and may have been formatted slightly differently depending on field width and precision, sometimes with unusual effects. Например, printf("%.2f\n", INFINITY) выводит 1.#J, так как #INF "округляется" до точности в два знака.For example, printf("%.2f\n", INFINITY) would print 1.#J because the #INF would be "rounded" to 2 digits of precision.

Примечание

Если аргумент, который соответствует %s или %S, или поле Buffer аргумента, который соответствует %Z, является указателем NULL, отображается значение "(NULL)".If the argument that corresponds to %s or %S, or the Buffer field of the argument that corresponds to %Z, is a null pointer, "(null)" is displayed.

Примечание

Во всех экспоненциальных форматах минимальное отображаемое количество цифр показателя степени по умолчанию равно двум (три используются только при необходимости).In all exponential formats, the minimum number of digits of exponent to display is two, using three only if necessary. С помощью функции _set_output_format можно задать три отображаемых знака для обеспечения обратной совместимости с кодом, написанным для Visual Studio 2013 и более ранних версий.By using the _set_output_format function, you can set the number of digits displayed to three for backward compatibility with code written for Visual Studio 2013 and before.

Важно!

Поскольку формат %n является небезопасным, по умолчанию он запрещен.Because the %n format is inherently insecure, it is disabled by default. Если в строке формата имеется символ %n, вызывается обработчик недопустимого параметра, как описано в разделе Проверка параметров.If %n is encountered in a format string, the invalid parameter handler is invoked, as described in Parameter Validation. Чтобы включить поддержку %n, изучите раздел _set_printf_count_output.To enable %n support, see _set_printf_count_output.

Директивы флаговFlag directives

Первое необязательное поле в спецификации преобразования содержит директивы флагов, ни одного или несколько символов флага, указывающих выравнивание выходных данных и управляющих выводом символов, пустых значений, начальных нулей, десятичных запятых и восьмеричных и шестнадцатеричных префиксов.The first optional field in a conversion specification contains flag directives, zero or more flag characters that specify output justification and control output of signs, blanks, leading zeros, decimal points, and octal and hexadecimal prefixes. В спецификации преобразования может быть указано несколько директив флагов, и символы флагов могут размещаться в любом порядке.More than one flag directive may appear in a conversion specification, and the flag characters can appear in any order.

Символы флаговFlag characters

FlagFlag ЗначениеMeaning Значение по умолчаниюDefault
- Выравнивание результата по левому краю в пределах заданной ширины поля.Left align the result within the given field width. Выравнивание по правому краю.Right align.
+ Если выходное значение имеет тип со знаком, используйте для него префикс + или –.Use a sign (+ or -) to prefix the output value if it is of a signed type. Знак отображается только для отрицательных значений со знаком –.Sign appears only for negative signed values (-).
00 Если width предшествует префикс 0, добавляется несколько ведущих нулей для достижения минимальной ширины.If width is prefixed by 0, leading zeros are added until the minimum width is reached. Если отображаются 0 и - , 0 игнорируется.If both 0 and - appear, the 0 is ignored. Если 0 указывается в целочисленном формате (i, u, x, X, o, d) и в сочетании со спецификацией точности, (например, %04.d), знак 0 игнорируется.If 0 is specified for an integer format (i, u, x, X, o, d) and a precision specification is also present—for example, %04.d—the 0 is ignored. Если 0 указывается в формате плавающей запятой a или A, в начало мантиссы добавляются ведущие нули после префикса 0x или 0X.If 0 is specified for the a or A floating-point format, leading zeros are prepended to the mantissa, after the 0x or 0X prefix. Без заполнения.No padding.
пустой (" ")blank (' ') Используйте пустой префикс для положительных выходных значений со знаком.Use a blank to prefix the output value if it is signed and positive. Пустой префикс игнорируется, если одновременно с ним присутствует флаг +.The blank is ignored if both the blank and + flags appear. Пустой префикс не отображается.No blank appears.
# Если используется в сочетании с форматом o, x или X, флаг # выводит префикс 0, 0x или 0X соответственно для всех ненулевых выходных значений.When it's used with the o, x, or X format, the # flag uses 0, 0x, or 0X, respectively, to prefix any nonzero output value. Пустой префикс не отображается.No blank appears.
При использовании с форматом e, E, f, F, a или A флаг # принудительно добавляет к выходному значению десятичный разделитель.When it's used with the e, E, f, F, a, or A format, the # flag forces the output value to contain a decimal point. Десятичный разделитель появляется, только если после него есть цифры.Decimal point appears only if digits follow it.
Если используется в сочетании с форматом g или G, флаг # принудительно добавляет десятичный разделитель к выходному значению и запрещает отбрасывать конечные нули.When it's used with the g or G format, the # flag forces the output value to contain a decimal point and prevents the truncation of trailing zeros.

Флаг игнорируется в сочетании с форматами c, d, i, u или s.Ignored when used with c, d, i, u, or s.
Десятичный разделитель появляется, только если после него есть цифры.Decimal point appears only if digits follow it. Конечные нули отбрасываются.Trailing zeros are truncated.

Спецификация шириныWidth specification

В спецификации преобразования необязательное поле спецификации ширины отображается после любых символов флага.In a conversion specification, the optional width specification field appears after any flags characters. Аргумент width — неотрицательное целое десятичное число, управляющее минимальным количеством выводимых символов.The width argument is a non-negative decimal integer that controls the minimum number of characters that are output. Если количество символов в выходном значении меньше заданной ширины, к значениям слева или справа (в зависимости от того, определен ли флаг выравнивания по левому краю ( - )) добавляются пробелы, в количестве, необходимом для достижения минимальной ширины.If the number of characters in the output value is less than the specified width, blanks are added to the left or the right of the values—depending on whether the left-alignment flag (-) is specified—until the minimum width is reached. Если параметр width имеет префикс 0, при преобразовании к целому числу или числу с плавающей запятой добавляются начальные нули до тех пор, пока не будет достигнута минимальная ширина, кроме случаев преобразования в бесконечность или NaN (не число).If width is prefixed by 0, leading zeros are added to integer or floating-point conversions until the minimum width is reached, except when conversion is to an infinity or NaN.

Спецификация ширины никогда не вызывает усечения значения.The width specification never causes a value to be truncated. Если число символов в выходном значении превышает указанную ширину или если аргумент width не задан, выводятся все символы значения в соответствии со спецификацией precision.If the number of characters in the output value is greater than the specified width, or if width isn't given, all characters of the value are output, subject to the precision specification.

Если в качестве спецификации ширины указана звездочка (*), значение ширины задается аргументом int из списка аргументов.If the width specification is an asterisk (*), an int argument from the argument list supplies the value. Аргумент width должен предшествовать форматируемому значению в списке аргументов, как показано в следующем примере:The width argument must precede the value that's being formatted in the argument list, as shown in this example:

printf("%0*d", 5, 3); /* 00003 is output */

Отсутствующее или малое значение width в спецификации преобразования не приводит к усечению выходного значения.A missing or small width value in a conversion specification doesn't cause the truncation of an output value. Если количество символов в результате преобразования больше значения параметра width, поле расширяется, чтобы вместить результат преобразования.If the result of a conversion is wider than the width value, the field expands to contain the conversion result.

Спецификация точностиPrecision specification

В спецификации преобразования третье необязательное поле является спецификацией точности.In a conversion specification, the third optional field is the precision specification. Эта спецификация состоит из точки (.), за которой следует неотрицательное целое десятичное число, которое, в зависимости от типа преобразования, определяет количество символов строки, количество десятичных разрядов или количество значащих цифр для вывода.It consists of a period (.) followed by a non-negative decimal integer that, depending on the conversion type, specifies the number of string characters, the number of decimal places, or the number of significant digits to be output.

В отличие от спецификации ширины, спецификация точности может вызывать либо усечение выходного значения, либо округление значения с плавающей запятой.Unlike the width specification, the precision specification can cause either truncation of the output value or rounding of a floating-point value. Если аргумент precision указан равным 0 и преобразуемое значение равно 0, никакие символы в результате выводиться не будут, как показано в следующем примере:If precision is specified as 0, and the value to be converted is 0, the result is no characters output, as shown in this example:

printf( "%.0d", 0 ); /* No characters output */

Если спецификация точности представляет собой звездочку (*), аргумент int из списка аргументов предоставляет значение.If the precision specification is an asterisk (*), an int argument from the argument list supplies the value. В списке аргументов аргумент precision должен предшествовать форматируемому значению, как показано в следующем примере:In the argument list, the precision argument must precede the value that's being formatted, as shown in this example:

printf( "%.*f", 3, 3.14159265 ); /* 3.142 output */

Символ type определяет либо интерпретацию аргумента precision, либо точность по умолчанию при опущенном аргументе precision, как показано в следующей таблице.The type character determines either the interpretation of precision or the default precision when precision is omitted, as shown in the following table.

Влияние значений точности на типHow Precision Values Affect Type

ТипType ЗначениеMeaning Значение по умолчаниюDefault
a, Aa, A Точность определяет количество цифр после запятой.The precision specifies the number of digits after the point. Точность по умолчанию — 13.Default precision is 13. Если точность равна 0, десятичная запятая не выводится, если не используется флаг # .If precision is 0, no decimal point is printed unless the # flag is used.
c, Cc, C Точность не применяется.The precision has no effect. Символ выводится.Character is printed.
d, i, o, u, x, Xd, i, o, u, x, X Точность определяет минимальное выводимое количество цифр.The precision specifies the minimum number of digits to be printed. Если количество цифр в аргументе меньше значения precision, выходное значение дополняется слева нулями.If the number of digits in the argument is less than precision, the output value is padded on the left with zeros. Значение не усекается, когда количество цифр превышает значение precision.The value is not truncated when the number of digits exceeds precision. Точность по умолчанию — 1.Default precision is 1.
e, Ee, E Выводимое количество знаков дробной части задается спецификацией точности.The precision specifies the number of digits to be printed after the decimal point. Последняя выводимая цифра округляется.The last printed digit is rounded. Точность по умолчанию — 6.Default precision is 6. Если аргумент precision равен 0 или присутствует точка (.) без числа после нее, десятичная запятая не выводится.If precision is 0 or the period (.) appears without a number following it, no decimal point is printed.
f, Ff, F Значение точности задает количество цифр после десятичной запятой.The precision value specifies the number of digits after the decimal point. Если десятичная запятая присутствует, перед ней присутствует по крайней мере одна цифра.If a decimal point appears, at least one digit appears before it. Значение округляется до соответствующего количества цифр.The value is rounded to the appropriate number of digits. Точность по умолчанию — 6.Default precision is 6. Если аргумент precision равен 0 или если присутствует точка (.) без числа после нее, десятичная запятая не выводится.If precision is 0, or if the period (.) appears without a number following it, no decimal point is printed.
g, Gg, G Точность определяет максимальное выводимое количество значащих цифр.The precision specifies the maximum number of significant digits printed. Выводятся шесть значащих цифр, а конечные нули усекаются.Six significant digits are printed, and any trailing zeros are truncated.
s, Ss, S Точность определяет максимальное количество выводимых символов.The precision specifies the maximum number of characters to be printed. Символы, выходящие за рамки precision, не выводятся.Characters in excess of precision aren't printed. Символы выводятся до тех пор, пока не будет обнаружен нуль-символ.Characters are printed until a null character is encountered.

Спецификация размера аргументаArgument size specification

В спецификации преобразования поле size — это модификатор длины аргумента для описателя преобразования type.In a conversion specification, the size field is an argument length modifier for the type conversion specifier. Префиксы поля size для поля type (hh, h, j, l (строчная L), L, ll, t, w, z, I (прописная i), I32 и I64) определяют "размер" соответствующего аргумента — длинный или короткий, 32- или 64-разрядный, однобайтовый или расширенный символ — в зависимости от описателя преобразования, который они модифицируют.The size field prefixes to the type field—hh, h, j, l (lowercase L), L, ll, t, w, z, I (uppercase i), I32, and I64—specify the "size" of the corresponding argument—long or short, 32-bit or 64-bit, single-byte character or wide character—depending on the conversion specifier that they modify. Эти префиксы размера используются с символами type в семействах функций printf и wprintf для определения интерпретации размеров аргументов, как показано в следующей таблице.These size prefixes are used with type characters in the printf and wprintf families of functions to specify the interpretation of argument sizes, as shown in the following table. Поле size является необязательным для некоторых типов аргументов.The size field is optional for some argument types. Если префикс размера не указан, модуль форматирования использует целые аргументы, например подписанные или не подписанные char, short, int, long и типы перечисления как 32-разрядные типы int, а аргументы float, double и long double с плавающей запятой используются как 64-разрядные типы double.When no size prefix is specified, the formatter consumes integer arguments—for example, signed or unsigned char, short, int, long, and enumeration types—as 32-bit int types, and float, double, and long double floating-point arguments are consumed as 64-bit double types. Такое поведение соответствует правилам повышения уровня аргументов по умолчанию для списков аргументов переменных.This behavior matches the default argument promotion rules for variable argument lists. Дополнительные сведения о повышении аргументов см. раздел Ellipses and Default Arguments (Многоточия и аргументы по умолчанию) в статье Postfix expressions (Постфиксные выражения).For more information about argument promotion, see Ellipses and Default Arguments in Postfix expressions. Как в 32-разрядной, так и в 64-разрядной системах спецификация преобразования 64-разрядного целого аргумента должна включать префикс размера ll или I64.On both 32-bit and 64-bit systems, the conversion specification of a 64-bit integer argument must include a size prefix of ll or I64. В противном случае поведение модуля форматирования не определено.Otherwise, the behavior of the formatter is undefined.

Некоторые типы имеют разный размер в 32-разрядном и 64-разрядном коде.Some types are different sizes in 32-bit and 64-bit code. Например, size_t на 32 бита длиннее в коде, скомпилированном для x86, и на 64 бита длиннее в коде, скомпилированном для x64.For example, size_t is 32 bits long in code compiled for x86, and 64 bits in code compiled for x64. Чтобы создать код форматирования для типов с переменным количеством байт, не зависящий от платформы, можно использовать модификатор размера аргумента с переменным количеством байт.To create platform-agnostic formatting code for variable-width types, you can use a variable-width argument size modifier. Кроме того, можно использовать 64-разрядный модификатор размера аргумента и явно повысить тип аргумента с переменным количеством байт до 64 бит.Alternatively, use a 64-bit argument size modifier and explicitly promote the variable-width argument type to 64 bits. Присущий Майкрософт модификатор размера аргумента I (прописная i) обрабатывает целочисленные аргументы переменной ширины, но для обеспечения переносимости рекомендуется использовать характерные для типа модификаторы j, t и z.The Microsoft-specific I (uppercase i) argument size modifier handles variable-width integer arguments, but we recommend the type-specific j, t, and z modifiers for portability.

Префиксы размера для описателей формата функций printf и wprintfSize Prefixes for printf and wprintf Format-Type Specifiers

Чтобы указатьTo specify Используемый префиксUse prefix Со спецификатором типаWith type specifier
char
unsigned char
hhhh d, i, o, u, x или Xd, i, o, u, x, or X
short int
short unsigned int
hh d, i, o, u, x или Xd, i, o, u, x, or X
__int32
unsigned __int32
I32I32 d, i, o, u, x или Xd, i, o, u, x, or X
__int64
unsigned __int64
I64I64 d, i, o, u, x или Xd, i, o, u, x, or X
intmax_t
uintmax_t
j или I64j or I64 d, i, o, u, x или Xd, i, o, u, x, or X
long double l (строчная L) или Ll (lowercase L) or L a, A, e, E, f, F, g или Ga, A, e, E, f, F, g, or G
long int
long unsigned int
l (строчная L)l (lowercase L) d, i, o, u, x или Xd, i, o, u, x, or X
long long int
unsigned long long int
ll (строчные LL)ll (lowercase LL) d, i, o, u, x или Xd, i, o, u, x, or X
ptrdiff_t t или I (прописная i)t or I (uppercase i) d, i, o, u, x или Xd, i, o, u, x, or X
size_t z или I (прописная i)z or I (uppercase i) d, i, o, u, x или Xd, i, o, u, x, or X
Однобайтовый символSingle-byte character hh c или Cc or C
Расширенный символWide character l (строчная L) или wl (lowercase L) or w c или Cc or C
Строка однобайтовых символовSingle-byte character string hh s, S или Zs, S, or Z
Строка расширенных символовWide-character string l (строчная L) или wl (lowercase L) or w s, S или Zs, S, or Z

Типы ptrdiff_t и size_t являются __int32 или unsigned __int32 на 32-разрядных платформах и __int64 или unsigned __int64 на 64-разрядных платформах.The ptrdiff_t and size_t types are __int32 or unsigned __int32 on 32-bit platforms, and __int64 or unsigned __int64 on 64-bit platforms. Префиксы размера I (прописная i), j, t и z принимают правильное значение ширины аргументов для платформы.The I (uppercase i), j, t, and z size prefixes take the correct argument width for the platform.

В Visual C++ хотя long double является отдельным типом, он имеет то же внутреннее представление, что и тип double.In Visual C++, although long double is a distinct type, it has the same internal representation as double.

Спецификатор типа hc или hC аналогичен c в функциях printf и C в функциях wprintf.An hc or hC type specifier is synonymous with c in printf functions and with C in wprintf functions. Спецификатор типа lc, lC, wc или wC аналогичен C в функциях printf и c в функциях wprintf.An lc, lC, wc, or wC type specifier is synonymous with C in printf functions and with c in wprintf functions. Спецификатор типа hs или hS аналогичен s в функциях printf и S в функциях wprintf.An hs or hS type specifier is synonymous with s in printf functions and with S in wprintf functions. Спецификатор типа ls, lS, ws или wS аналогичен S в функциях printf и s в функциях wprintf.An ls, lS, ws or wS type specifier is synonymous with S in printf functions and with s in wprintf functions.

Примечание

Относится только к системам Майкрософт. Префиксы модификатора размера аргумента I (прописная i), I32, I64 и w являются расширениями Майкрософт и не совместимы с C стандарта ISO.Microsoft Specific The I (uppercase i), I32, I64, and w argument size modifier prefixes are Microsoft extensions and are not ISO C-compatible. Префикс h при использовании с данными типа char и префикс l (строчная L) при использовании с данными типа double являются расширениями Майкрософт.The h prefix when it's used with data of type char and the l (lowercase L) prefix when it's used with data of type double are Microsoft extensions.

См. такжеSee also

printf, _printf_l, wprintf, _wprintf_lprintf, _printf_l, wprintf, _wprintf_l
printf_s, _printf_s_l, wprintf_s, _wprintf_s_lprintf_s, _printf_s_l, wprintf_s, _wprintf_s_l
Позиционные параметры printf_pprintf_p Positional Parameters