.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 1999 Andries Brouwer (aeb@cwi.nl) .\" .\" Earlier versions of this page influenced the present text. .\" It was derived from a Berkeley page with version .\" @(#)printf.3 6.14 (Berkeley) 7/30/91 .\" converted for Linux by faith@cs.unc.edu, updated by .\" Helmut.Geyer@iwr.uni-heidelberg.de, agulbra@troll.no and Bruno Haible. .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\" 1999-11-25 aeb - Rewritten, using SUSv2 and C99. .\" 2000-07-26 jsm28@hermes.cam.ac.uk - three small fixes .\" 2000-10-16 jsm28@hermes.cam.ac.uk - more fixes .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH printf 3 "15 декабря 2022 г." "Linux man\-pages 6.02" .SH ИМЯ printf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf \- преобразование форматированного вывода .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint printf(const char *restrict \fP\fIformat\fP\fB, ...);\fP \fBint fprintf(FILE *restrict \fP\fIstream\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, ...);\fP \fBint dprintf(int \fP\fIfd\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, ...);\fP \fBint sprintf(char *restrict \fP\fIstr\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, ...);\fP \fBint snprintf(char \fP\fIstr\fP\fB[restrict .\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, ...);\fP .PP \fBint vprintf(const char *restrict \fP\fIformat\fP\fB, va_list \fP\fIap\fP\fB);\fP \fBint vfprintf(FILE *restrict \fP\fIstream\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, va_list \fP\fIap\fP\fB);\fP \fBint vdprintf(int \fP\fIfd\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, va_list \fP\fIap\fP\fB);\fP \fBint vsprintf(char *restrict \fP\fIstr\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, va_list \fP\fIap\fP\fB);\fP \fBint vsnprintf(char \fP\fIstr\fP\fB[restrict .\fP\fIsize\fP\fB], size_t \fP\fIsize\fP\fB,\fP \fB const char *restrict \fP\fIformat\fP\fB, va_list \fP\fIap\fP\fB);\fP .fi .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBsnprintf\fP(), \fBvsnprintf\fP(): .nf _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE || /* Glibc <= 2.19: */ _BSD_SOURCE .fi .PP \fBdprintf\fP(), \fBvdprintf\fP(): .nf Since glibc 2.10: _POSIX_C_SOURCE >= 200809L Before glibc 2.10: _GNU_SOURCE .fi .SH ОПИСАНИЕ The functions in the \fBprintf\fP() family produce output according to a \fIformat\fP as described below. The functions \fBprintf\fP() and \fBvprintf\fP() write output to \fIstdout\fP, the standard output stream; \fBfprintf\fP() and \fBvfprintf\fP() write output to the given output \fIstream\fP; \fBsprintf\fP(), \fBsnprintf\fP(), \fBvsprintf\fP(), and \fBvsnprintf\fP() write to the character string \fIstr\fP. .PP The function \fBdprintf\fP() is the same as \fBfprintf\fP() except that it outputs to a file descriptor, \fIfd\fP, instead of to a \fBstdio\fP(3) stream. .PP Функции \fBsnprintf\fP() и \fBvsnprintf\fP() записывают не более \fIsize\fP байт (включая конечный байт null (\(aq\e0\(aq)) в \fIstr\fP. .PP Функции \fBvprintf\fP(), \fBvfprintf\fP(), \fBvdprintf\fP(), \fBvsprintf\fP(), \fBvsnprintf\fP() эквивалентны \fBprintf\fP(), \fBfprintf\fP(), \fBdprintf\fP(), \fBsprintf\fP(), \fBsnprintf\fP(), соответственно, за исключением того, что они вызываются с \fIva_list\fP, а не переменным числом аргументов. Эти функции не вызывают макрос \fIva_end\fP. Так как они вызывают макрос \fIva_arg\fP, значение \fIap\fP не определено после вызова. Смотрите \fBstdarg\fP(3). .PP Все эти функции выводят данные в соответствии со строкой \fIformat\fP, которая определяет, каким образом последующие параметры (или доступные параметры переменной длины из \fBstdarg\fP(3)) преобразуют поток вывода. .PP В C99 и POSIX.1\-2001 указано, что результат не определён, если вызов \fBsprintf\fP(), \fBsnprintf\fP(), \fBvsprintf\fP() или \fBvsnprintf\fP() привёл бы копированию между перекрывающимися объектами (например, если массив строк назначения и один из указанных входных аргументов ссылаются на один буфер). Смотрите ЗАМЕЧАНИЯ. .SS "Структура строки формата" Строка параметров — это строка символов, начинающаяся и заканчивающаяся в своём начальном состоянии сдвига, если оно есть. Строка может состоять из нуля или более директив: обычных символов (кроме \fB%\fP), которые неизменно копируются в поток выхода; и спецификаторов преобразования, по каждому из которых выбирается ноль или более последующих параметров. Каждый спецификатор преобразований начинается с символа \fB%\fP и заканчивается \fIспецификатором преобразования\fP. Между ними могут находиться (в определённом порядке) ноль или более \fIфлагов\fP, необязательная минимальная \fIширина поля\fP, необязательная \fIточность\fP и необязательный \fIмодификатор длины\fP. .PP The overall syntax of a conversion specification is: .PP .in +4n .nf %[$][flags][width][.precision][length modifier]conversion .fi .in .PP Параметры должны точно соответствовать (после преобразования типа) спецификаторам преобразований. По умолчанию параметры используются в порядке поступления, где каждая «*» (смотрите \fIШирина поля\fP и \fIТочность\fP ниже) и каждый спецификатор преобразования требуют последующего параметра (если указано недостаточно параметров, то это приведёт к ошибке). Возможно явное указание на то, какой параметр будет следующим, с помощью записи «%m$» вместо «%» и «*m$» вместо «*ю, где десятичная цифра \fIm\fP означает позицию нужного параметра в их списке; список начинается с единицы. Таким образом, .PP .in +4n .EX printf("%*d", width, num); .EE .in .PP и .PP .in +4n .EX printf("%2$*1$d", width, num); .EE .in .PP означают одно и то же. Вторая форма записи позволяет производить указание на тот же параметр несколько раз. Стандарт C99 не поддерживает использование «$», который пришёл из Single UNIX Specification. Если используется «$», то он должен использоваться для всех преобразований аргументов и во всех аргументах ширины и точности, но он может быть смешан с форматами «%%», которые не поглощают аргументы. Там может не быть пробелов между числами аргументов, обусловленные использованием «$». Например, если аргументы 1 и 3 определены, то аргумент 2 должен также быть определён где\-то в строке параметров. .PP В некоторых цифровых преобразованиях используется символ разделения целой и дробной частей или символ разделения тысяч. Текущий символ зависит от локали, а именно от значения переменной \fBLC_NUMERIC\fP (смотрите \fBsetlocale\fP(3)).В локали POSIX по умолчанию используется символ «.» и не отсутствует символ разделения. Таким образом, .PP .in +4n .EX printf("%\(aq.2f", 1234567.89); .EE .in .PP выводит «1234567.89» при локали POSIX, «1234567,89» при локали nl_NL и «1.234.567,89» при локали da_DK. .SS Флаги За символом % может быть указано ноль или несколько следующих флагов: .TP \fB#\fP The value should be converted to an "alternate form". For \fBo\fP conversions, the first character of the output string is made zero (by prefixing a 0 if it was not zero already). For \fBx\fP and \fBX\fP conversions, a nonzero result has the string "0x" (or "0X" for \fBX\fP conversions) prepended to it. For \fBa\fP, \fBA\fP, \fBe\fP, \fBE\fP, \fBf\fP, \fBF\fP, \fBg\fP, and \fBG\fP conversions, the result will always contain a decimal point, even if no digits follow it (normally, a decimal point appears in the results of those conversions only if a digit follows). For \fBg\fP and \fBG\fP conversions, trailing zeros are not removed from the result as they would otherwise be. For \fBm\fP, if \fIerrno\fP contains a valid error code, the output of \fIstrerrorname_np(errno)\fP is printed; otherwise, the value stored in \fIerrno\fP is printed as a decimal number. For other conversions, the result is undefined. .TP \fB\&0\fP В значение добавляются нули. При преобразованиях типа \fBd\fP, \fBi\fP, \fBo\fP, \fBu\fP, \fBx\fP, \fBX\fP, \fBa\fP, \fBA\fP, \fBe\fP, \fBE\fP, \fBf\fP, \fBF\fP, \fBg\fP и \fBG\fP преобразуемое значение слева дополняется нулями (вместо пробелов). Если присутствуют флаги \fB\&0\fP и \fB\-\fP, то флаг \fB\&0\fP игнорируется. Если в числовом преобразовании указана точность (\fBd\fP, \fBi\fP, \fBo\fP, \fBu\fP, \fBx\fP, и \fBX\fP), то флаг \fB\&0\fP игнорируется. Поведение флага при других преобразованиях не определено. .TP \fB\-\fP Выравнивает результат преобразования по левой границе поля (по умолчанию выравнивание выполняется справа). Преобразованное значение дополняется справа пробелами, а не пробелами или нулями слева. Флаг \fB\-\fP отменяет флаг «0», если было указано оба флага. .TP \fB\(aq \(aq\fP (пробел). Устанавливает слева перед положительными числами (или пустой строкой) знак пробела при знаковых преобразованиях. .TP \fB+\fP Знак + или \- всегда помещается перед преобразованным числом со знаком. По умолчанию знак используется только для отрицательных чисел. Флаг \fB+\fP отменяет действие пробела, если указаны оба флага. .PP Пять флагов, описанных выше, определены в стандарте C99. В стандарте Single UNIX Specification определён ещё один дополнительный флаг. .TP \fB\(aq\fP For decimal conversion (\fBi\fP, \fBd\fP, \fBu\fP, \fBf\fP, \fBF\fP, \fBg\fP, \fBG\fP) the output is to be grouped with thousands' grouping characters if the locale information indicates any. (See \fBsetlocale\fP(3).) Note that many versions of \fBgcc\fP(1) cannot parse this option and will issue a warning. (SUSv2 did not include \fI%\(aqF\fP, but SUSv3 added it.) Note also that the default locale of a C program is "C" whose locale information indicates no thousands' grouping character. Therefore, without a prior call to \fBsetlocale\fP(3), no thousands' grouping characters will be printed. .PP В glibc 2.2 добавлен ещё один флаг. .TP \fBI\fP .\" outdigits keyword in locale file При преобразовании целых десятичных чисел (\fBi\fP, \fBd\fP, \fBu\fP) в результате используется альтернативное представление цифр согласно локали. Например, начиная с glibc 2.2.3 это даёт арабско\-индийские цифры для персидской локали («fa_IR»). .SS "Ширина поля" Необязательная строка из десятичных цифр (с первой цифрой, отличной от нуля) определяет минимальную ширину поля. Если преобразованное значение имеет меньшее количество знаков, чем ширина поля, то оно слева дополняется пробелами (или справа, если указан флаг выравнивания по левому краю). Вместо строки десятичных цифр можно указать «*» или «*m$» (для некоторого десятичного числа \fIm\fP), чтобы определить ширину поля по ширине следующего аргумента или аргумента с номером \fIm\fP (должен быть типа \fIint\fP), соответственно. Отрицательная ширина поля принимается как флаг «\-», устанавливающий положительную ширину поля. Несуществующая или небольшая ширина поля не делает его усечённым; если результат преобразования больше ширины поля, то поле расширяется, чтобы вместить в себя преобразованное значение. .SS Точность Необязательный параметр точности в виде знака точки («.») сопровождается необязательной строкой десятичных цифр. Вместо строки десятичных цифр можно указать «*» или «*m$» (для некоторого десятичного числа \fIm\fP), чтобы определить значение точности по следующему аргументу или аргументу с номером \fIm\fP (должен быть типа \fIint\fP), соответственно. Если точность указана как «.», то она обрабатывается как нулевая. Отрицательная точность обрабатывается как если не указывалась совсем. Это позволяет ограничивать количество выводимых символов для преобразований \fBd\fP, \fBi\fP, \fBo\fP, \fBu\fP, \fBx\fP и \fBX\fP; показывать определённое количество цифр после десятичной точки для преобразований \fBa\fP, \fBA\fP, \fBe\fP, \fBE\fP, \fBf\fP и \fBF\fP; показывать максимальное количество значащих цифр для преобразований \fBg\fP и \fBG\fP или максимальное количество символов для печати строк при преобразованиях \fBs\fP и \fBS\fP. .SS "Модификатор длины" Устанавливаются для следующих «преобразований целого» \fBd\fP, \fBi\fP, \fBo\fP, \fBu\fP, \fBx\fP или \fBX\fP. .TP \fBhh\fP Преобразование целого числа соответствует аргументам \fIsigned char\fP или \fIunsigned char\fP, а также тип преобразования \fBn\fP соответствует указателю на аргумент \fIsigned char\fP. .TP \fBh\fP A following integer conversion corresponds to a \fIshort\fP or \fIunsigned short\fP argument, or a following \fBn\fP conversion corresponds to a pointer to a \fIshort\fP argument. .TP \fBl\fP (ell) A following integer conversion corresponds to a \fIlong\fP or \fIunsigned long\fP argument, or a following \fBn\fP conversion corresponds to a pointer to a \fIlong\fP argument, or a following \fBc\fP conversion corresponds to a \fIwint_t\fP argument, or a following \fBs\fP conversion corresponds to a pointer to \fIwchar_t\fP argument. On a following \fBa\fP, \fBA\fP, \fBe\fP, \fBE\fP, \fBf\fP, \fBF\fP, \fBg\fP, or \fBG\fP conversion, this length modifier is ignored (C99; not in SUSv2). .TP \fBll\fP (ell\-ell). A following integer conversion corresponds to a \fIlong long\fP or \fIunsigned long long\fP argument, or a following \fBn\fP conversion corresponds to a pointer to a \fIlong long\fP argument. .TP \fBq\fP Синоним \fBll\fP. Является нестандартным расширением, унаследовано от BSD; не используйте в новом коде. .TP \fBL\fP Типы преобразования \fBa\fP, \fBA\fP, \fBe\fP, \fBE\fP, \fBf\fP, \fBF\fP, \fBg\fP или \fBG\fP соответствуют аргументу \fIlong double\fP (в C99 допускается %LF, но в SUSv2 нет). .TP \fBj\fP Преобразование целого числа соответствует аргументам \fIintmax_t\fP или \fIuintmax_t\fP, а также тип преобразования \fBn\fP соответствует указателю на аргумент \fIintmax_t\fP. .TP \fBz\fP Преобразование целого числа соответствует аргументам \fIsize_t\fP или \fIssize_t\fP, а также тип преобразования \fBn\fP соответствует указателю на аргумент \fIsize_t\fP. .TP \fBZ\fP Нестандартный синоним \fBz\fP, который появился до \fBz\fP. Не используйте в новом коде. .TP \fBt\fP Преобразование целого числа соответствует аргументам \fIptrdiff_t\fP или тип преобразования \fBn\fP соответствует указателю на аргумент \fIptrdiff_t\fP. .PP В SUSv3 определено всё вышеперечисленное, за исключением указанных как нестандартное расширение. В SUSv2 определены только модификаторы длины \fBh\fP (в \fBhd\fP, \fBhi\fP, \fBho\fP, \fBhx\fP, \fBhX\fP, \fBhn\fP) и \fBl\fP (в \fBld\fP, \fBli\fP, \fBlo\fP, \fBlx\fP, \fBlX\fP, \fBln\fP, \fBlc\fP, \fBls\fP) и \fBL\fP (в \fBLe\fP, \fBLE\fP, \fBLf\fP, \fBLg\fP, \fBLG\fP). .PP .\" As a nonstandard extension, the GNU implementations treats \fBll\fP and \fBL\fP as synonyms, so that one can, for example, write \fBllg\fP (as a synonym for the standards\-compliant \fBLg\fP) and \fBLd\fP (as a synonym for the standards compliant \fBlld\fP). Such usage is nonportable. .SS "Тип преобразования" Символы, которые определены как типы преобразования. Типы преобразования и их значения: .TP \fBd\fP, \fBi\fP Параметр \fIint\fP преобразует символы в их знаковое десятичное отображение. Точность (если указана) задаёт минимальное количество цифр в изображении результата; если результат можно показать с помощью меньшего количества цифр, то слева добавляются незначащие нули. По умолчанию значение точности равно единице. При выводе нуля с нулевой точностью выходной поток будет пуст. .TP \fBo\fP, \fBu\fP, \fBx\fP, \fBX\fP Параметр \fIunsigned int\fP преобразуется в беззнаковое восьмеричное число (\fBo\fP), беззнаковое десятичное (\fBu\fP) или беззнаковое шестнадцатеричное (\fBx\fP и \fBX\fP). Буквы \fBabcdef\fP используются в преобразованиях \fBx\fP; буквы \fBABCDEF\fP используются в преобразованиях \fBX\fP. Точность (если указана) задаёт минимальное количество цифр в изображении результата; если результат можно показать с помощью меньшего количества цифр, то слева добавляются незначащие нули. По умолчанию значение точности равно единице. При выводе нуля с нулевой точностью выходной поток будет пуст. .TP \fBe\fP, \fBE\fP Параметр \fIdouble\fP округляется и преобразуется в вид [\-]d\fB\&.\fPddd\fBe\fP\(+-dd, в котором есть одна цифра (не равная нулю, если аргумент не равен нулю) до символа десятичной точки и количество цифр после, указывающих на требуемую точность. Если точность отсутствует, она принимается равной 6; если точность равна нулю, десятичная точка не показывается. В преобразовании для представление экспоненты \fBE\fP используется буква \fBE\fP (а не \fBe\fP). В экспоненте всегда не менее двух цифр; если значение ноль, то экспонента выводится как 00. .TP \fBf\fP, \fBF\fP Параметр \fIdouble\fP округляется и преобразуется в десятичное выражение в виде [\-]ddd\fB\&.\fPddd, где количество цифр после десятичной точки указывает на требуемую точность. Если точность отсутствует, она принимается равной 6\-и; если точность равна нулю, десятичная точка не показывается. Если десятичная точка есть, перед ней должна быть минимум одна цифра .IP (в SUSv2 отсутствует информация о \fBF\fP и указано, что этот символ предназначен для отображения символов бесконечности и NaN. В SUSv3 добавлен тип \fBF\fP. В стандарте C99 определены «[\-]inf» или «[\-]infinity» для указания бесконечности, и строка начинающаяся с «nan» для NaN в случае, если тип преобразования равен \fBf\fP, а начинающаяся с «[\-]INF», «[\-]INFINITY» или «NAN» в случае, если тип преобразования равен \fBF\fP). .TP \fBg\fP, \fBG\fP Параметр \fIdouble\fP преобразуется в стиле \fBf\fP или \fBe\fP (или \fBF\fP или \fBE\fP, для преобразования \fBG\fP). Точность определяется количеством значащих цифр. Если точность отсутствует, то она определяется равной 6\-и цифрам; если точность равна нулю, то она трактуется как 1. Стиль \fBe\fP используется, если экспонента преобразования меньше \-4, или больше или равна ей. Завершающие нули удаляются из дробной части результата; десятичная точка стоит, только если за ней следует, по крайней мере, одна цифра. .TP \fBa\fP, \fBA\fP (C99; not in SUSv2, but added in SUSv3) For \fBa\fP conversion, the \fIdouble\fP argument is converted to hexadecimal notation (using the letters abcdef) in the style [\-]\fB0x\fPh\fB\&.\fPhhhh\fBp\fP\(+-d; for \fBA\fP conversion the prefix \fB0X\fP, the letters ABCDEF, and the exponent separator \fBP\fP is used. There is one hexadecimal digit before the decimal point, and the number of digits after it is equal to the precision. The default precision suffices for an exact representation of the value if an exact representation in base 2 exists and otherwise is sufficiently large to distinguish values of type \fIdouble\fP. The digit before the decimal point is unspecified for nonnormalized numbers, and nonzero but otherwise unspecified for normalized numbers. The exponent always contains at least one digit; if the value is zero, the exponent is 0. .TP \fBc\fP Если модификатор \fBl\fP не указан, то параметр \fIint\fP преобразуется в \fIunsigned char\fP и выводится как результирующее значение. Если \fBl\fP указан, то параметр \fIwint_t\fP (широкий символ) преобразуется в многобайтовую последовательность вызовом функции \fBwcrtomb\fP(3); первое его значение преобразуется в начальное значение и выводится в виде многобайтовой строки. .TP \fBs\fP Если модификатор \fBl\fP не указан: параметр \fIconst char\ *\fP преобразуется в указатель на массив символьного типа (строковый указатель). Символы из массива выводятся до конечного байта null (\(aq\e0\(aq, не включая его); если указана точность, то выводится не более установленного количества символов. Если точность указана, то байт null не нужен. Если точность не указана или она больше, чем размер массива, то массив должен содержать конечный байт null. .IP Если модификатор \fBl\fP указан: параметр \fIconst wchar_t\ *\fP должен быть указателем на массив широких символов. Широкие символы из массива преобразуются в многобайтовые символы (каждый вызовом функции \fBwcrtomb\fP(3), при этом первое значение преобразуется в начальное значение первого широкого символа) и так до конечного широкого символа null. Результирующие многобайтовые символы выводятся до конечного байта null (не включая его). Если указана точность, то выводится количество байтов, не превышающее это значение, а оставшаяся часть многобайтовых символов не выводится. Заметим, что точность определяется количеством выведенных \fIбайт\fP, не \fIшироких символов\fP или \fIположением на экране\fP. Массив должен содержать конечный широкий символ null, если точность не указана, и содержать количество байт, меньше размера массива. .TP \fBC\fP (отсутствует в C99 или C11, но есть в SUSv2, SUSv3 и SUSv4) Синоним \fBlc\fP. Не используйте. .TP \fBS\fP (отсутствует в C99 или C11, но есть в SUSv2, SUSv3 и SUSv4) Синоним \fBls\fP. Не используйте. .TP \fBp\fP Параметр указателя \fIvoid\ *\fP, выводящийся в шестнадцатеричном виде (также как при \fB%#x\fP или \fB%#lx\fP). .TP \fBn\fP Количество символов, выводящихся в целом типе int * (или других) без преобразующих параметров. Данный параметр должен быть \fIint\ *\fP или его вариантом, размер которого совпадает с (необязательно) указываемым целым модификатором длины. Параметр не преобразуется (данный тип не поддерживается библиотекой bionic C). Поведение не определено, если тип преобразования содержит флаги, ширину поля или точность. .TP \fBm\fP (Glibc extension; supported by uClibc and musl.) Print output of \fIstrerror(errno)\fP (or \fIstrerrorname_np(errno)\fP in the alternate form). No argument is required. .TP \fB%\fP Выводит символ \(aq%\(aq. Параметр не требуется. Полный спецификатор преобразования — \(aq%%\(aq. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении данные функции возвращают количество напечатанных символов (не включая байт null, используемый в конце выводимых строк). .PP Функции \fBsnprintf\fP() и \fBvsnprintf\fP() записывают не более \fIsize\fP байт (включая конечный байт null (\(aq\e0\(aq)). Если вывод был обрезан из\-за данного ограничения, то возвращаемое значение это количество символов (не включая конечный байт null), которое было бы записано в результирующую строку, если бы было достаточно места. Таким образом, если возвращённое значение больше или равно \fIsize\fP, то вывод был обрезан (также смотрите ЗАМЕЧАНИЯ ниже). .PP Если возникла ошибка, то возвращается отрицательное значение. .SH ВЕРСИИ .\" Linux libc4 knows about the five C standard flags. .\" It knows about the length modifiers \fBh\fP, \fBl\fP, \fBL\fP, .\" and the conversions .\" \fBc\fP, \fBd\fP, \fBe\fP, \fBE\fP, \fBf\fP, \fBF\fP, .\" \fBg\fP, \fBG\fP, \fBi\fP, \fBn\fP, \fBo\fP, \fBp\fP, .\" \fBs\fP, \fBu\fP, \fBx\fP, and \fBX\fP, .\" where \fBF\fP is a synonym for \fBf\fP. .\" Additionally, it accepts \fBD\fP, \fBO\fP, and \fBU\fP as synonyms .\" for \fBld\fP, \fBlo\fP, and \fBlu\fP. .\" (This is bad, and caused serious bugs later, when .\" support for \fB%D\fP disappeared.) .\" No locale-dependent radix character, .\" no thousands' separator, no NaN or infinity, no "%m$" and "*m$". .\" .PP .\" Linux libc5 knows about the five C standard flags and the \(aq flag, .\" locale, "%m$" and "*m$". .\" It knows about the length modifiers \fBh\fP, \fBl\fP, \fBL\fP, .\" \fBZ\fP, and \fBq\fP, but accepts \fBL\fP and \fBq\fP .\" both for \fIlong double\fP and for \fIlong long\fP (this is a bug). .\" It no longer recognizes \fBF\fP, \fBD\fP, \fBO\fP, and \fBU\fP, .\" but adds the conversion character .\" .BR m , .\" which outputs .\" .IR strerror(errno) . .\" .PP .\" glibc 2.0 adds conversion characters \fBC\fP and \fBS\fP. .\" .PP В glibc 2.1 добавлены модификаторы длины \fBhh\fP, \fBj\fP, \fBt\fP и \fBz\fP и символы преобразования \fBa\fP и \fBA\fP. .PP В glibc 2.2 добавлен символ преобразования \fBF\fP с семантикой C99, а также флаг \fBI\fP. .PP glibc 2.35 gives a meaning to the alternate form (\fB#\fP) of the \fBm\fP conversion specifier, that is \fI%#m\fP. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .ad l .nh .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ \fBprintf\fP(), \fBfprintf\fP(), \fBsprintf\fP(), \fBsnprintf\fP(), \fBvprintf\fP(), \fBvfprintf\fP(), \fBvsprintf\fP(), \fBvsnprintf\fP() T} Безвредность в нитях MT\-Safe locale .TE .hy .ad .sp 1 .SH СТАНДАРТЫ \fBfprintf\fP(), \fBprintf\fP(), \fBsprintf\fP(), \fBvprintf\fP(), \fBvfprintf\fP(), \fBvsprintf\fP(): POSIX.1\-2001, POSIX.1\-2008, C89, C99. .PP \fBsnprintf\fP(), \fBvsnprintf\fP(): POSIX.1\-2001, POSIX.1\-2008, C99. .PP Функции \fBdprintf\fP() и \fBvdprintf\fP() изначально являлись расширениями GNU, но позже были стандартизованы в POSIX.1\-2008. .PP Что касается возвращаемого значения \fBsnprintf\fP(), то стандарты SUSv2 и C99 противоречат друг другу: когда \fBsnprintf\fP() вызывается с \fIsize\fP=0, то SUSv2 предусматривает возврат неопределённого значения меньше единицы, а C99 устанавливает в этом случае \fIstr\fP равным NULL и возвращает значение (как обычно) в виде количества символов, достаточного для выходной строки. В POSIX.1\-2001 и новее поведение \fBsnprintf\fP() совпадает с C99. .SH ЗАМЕЧАНИЯ В некоторых программах неосмотрительно используется код .PP .in +4n .EX sprintf(buf, "%s some further text", buf); .EE .in .PP .\" http://sourceware.org/bugzilla/show_bug.cgi?id=7075 для добавления текста в \fIbuf\fP. Однако в стандартах явно сказано, что результат не определён, если буферы источника и приёмника перекрываются при вызовах \fBsprintf\fP(), \fBsnprintf\fP(), \fBvsprintf\fP() и \fBvsnprintf\fP(). В зависимости о версии \fBgcc\fP(1) и указанных параметрах компилятора, подобные вызовы \fBне\fP приводят к ожидаемым результатам. .PP .\" .SH HISTORY .\" UNIX V7 defines the three routines .\" .BR printf (), .\" .BR fprintf (), .\" .BR sprintf (), .\" and has the flag \-, the width or precision *, the length modifier l, .\" and the conversions doxfegcsu, and also D,O,U,X as synonyms for ld,lo,lu,lx. .\" This is still true for 2.9.1BSD, but 2.10BSD has the flags .\" #, + and and no longer mentions D,O,U,X. .\" 2.11BSD has .\" .BR vprintf (), .\" .BR vfprintf (), .\" .BR vsprintf (), .\" and warns not to use D,O,U,X. .\" 4.3BSD Reno has the flag 0, the length modifiers h and L, .\" and the conversions n, p, E, G, X (with current meaning) .\" and deprecates D,O,U. .\" 4.4BSD introduces the functions .\" .BR snprintf () .\" and .\" .BR vsnprintf (), .\" and the length modifier q. .\" FreeBSD also has functions .\" .BR asprintf () .\" and .\" .BR vasprintf (), .\" that allocate a buffer large enough for .\" .BR sprintf (). .\" In glibc there are functions .\" .BR dprintf () .\" and .\" .BR vdprintf () .\" that print to a file descriptor instead of a stream. The glibc implementation of the functions \fBsnprintf\fP() and \fBvsnprintf\fP() conforms to the C99 standard, that is, behaves as described above, since glibc 2.1. Until glibc 2.0.6, they would return \-1 when the output was truncated. .SH ДЕФЕКТЫ .\" .PP .\" Linux libc4.[45] does not have a .\" .BR snprintf (), .\" but provides a libbsd that contains an .\" .BR snprintf () .\" equivalent to .\" .BR sprintf (), .\" that is, one that ignores the .\" .I size .\" argument. .\" Thus, the use of .\" .BR snprintf () .\" with early libc4 leads to serious security problems. Так как \fBsprintf\fP() и \fBvsprintf\fP() работают со строкой произвольной длины, вызывающие должны стараться не переполнить реальное пространство; часто это невозможно гарантировать. Заметим, что длина получаемых строк зависит от локали и её сложно предсказать. Вместо них используйте \fBsnprintf\fP() и \fBvsnprintf\fP() (или \fBasprintf\fP(3) и \fBvasprintf\fP(3)). .PP .\" .PP .\" Some floating-point conversions under early libc4 .\" caused memory leaks. Код, подобный \fBprintf(\fP\fIfoo\fP\fB);\fP часто означает ошибку, так как \fIfoo\fP может содержать символ %. Если содержимое \fIfoo\fP пришло из недоверительного пользовательского ввода, то в нём может содержаться \fB%n\fP, из\-за чего вызов \fBprintf\fP() сделать запись в память и создаст дыру в безопасности. .SH ПРИМЕРЫ Печать \fIPi\fP с пятью знаками: .PP .in +4n .EX #include #include fprintf(stdout, "pi = %.5f\en", 4 * atan(1.0)); .EE .in .PP Печать даты и времени в виде «Sunday, July 3, 10:02», где \fIweekday\fP и \fImonth\fP указатели на строки: .PP .in +4n .EX #include fprintf(stdout, "%s, %s %d, %.2d:%.2d\en", weekday, month, day, hour, min); .EE .in .PP Во многих странах используется порядок день\-месяц\-год. Вот печать аргументов в формате с учётом интернациональности: .PP .in +4n .EX #include fprintf(stdout, format, weekday, month, day, hour, min); .EE .in .PP где \fIformat\fP зависит от локали и может переставлять аргументы. Со значением: .PP .in +4n .EX "%1$s, %3$d. %2$s, %4$d:%5$.2d\en" .EE .in .PP получается «Sonntag, 3. Juli, 10:02». .PP Выделение достаточно большой строки и печать в неё (код работает и с glibc 2.0, и с glibc 2.1): .PP .EX #include #include #include char * make_message(const char *fmt, ...) { int n = 0; size_t size = 0; char *p = NULL; va_list ap; /* Determine required size. */ va_start(ap, fmt); n = vsnprintf(p, size, fmt, ap); va_end(ap); if (n < 0) return NULL; size = (size_t) n + 1; /* One extra byte for \(aq\e0\(aq */ p = malloc(size); if (p == NULL) return NULL; va_start(ap, fmt); n = vsnprintf(p, size, fmt, ap); va_end(ap); if (n < 0) { free(p); return NULL; } return p; } .EE .PP If truncation occurs in glibc versions prior to glibc 2.0.6, this is treated as an error instead of being handled gracefully. .SH "СМ. ТАКЖЕ" \fBprintf\fP(1), \fBasprintf\fP(3), \fBputs\fP(3), \fBscanf\fP(3), \fBsetlocale\fP(3), \fBstrfromd\fP(3), \fBwcrtomb\fP(3), \fBwprintf\fP(3), \fBlocale\fP(5) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .