printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
| Определено в заголовке <stdio.h>
|
||
int printf( const char* format, ... );
|
(1) | (до C99) |
int printf( const char* restrict format, ... );
|
(начиная с C99) | |
int fprintf( FILE* stream, const char* format, ... );
|
(2) | (до C99) |
int fprintf( FILE* restrict stream, const char* restrict format, ... );
|
(начиная с C99) | |
int sprintf( char* buffer, const char* format, ... );
|
(3) | (до C99) |
int sprintf( char* restrict buffer, const char* restrict format, ... );
|
(начиная с C99) | |
int snprintf( char* restrict buffer, size_t bufsz,
const char* restrict format, ... );
|
(4) | (начиная с C99) |
int printf_s( const char* restrict format, ... );
|
(5) | (начиная с C11) |
int fprintf_s( FILE* restrict stream, const char* restrict format, ... );
|
(6) | (начиная с C11) |
int sprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, ... );
|
(7) | (начиная с C11) |
int snprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, ... );
|
(8) | (начиная с C11) |
Загружает данные из указанных мест, преобразует их в эквиваленты строк символов и записывает результаты в различные приёмники/потоки:
stream.buffer. Поведение не определено, если строка, которая должна быть записана (плюс завершающий нулевой символ), превышает размер массива, на который указывает buffer.buffer. Записывается не более bufsz - 1 символов. Результирующая строка символов будет завершена нулевым символом, если только bufsz не равно нулю. Если bufsz равно нулю, ничего не записывается, и buffer может быть нулевым указателем, однако возвращаемое значение (количество байтов, которое было бы записано без учёта завершающего нуля) всё равно вычисляется и возвращается.- спецификатор преобразования
%nприсутствует вformat - любой из аргументов, соответствующих
%sявляется нулевым указателем streamилиformatилиbufferявляется нулевым указателемbufszравно нулю или больше RSIZE_MAX- возникают ошибки кодирования в любом из строковых и символьных спецификаторов преобразования
- (для
sprintf_sтолько), строка, которая должна быть сохранена вbuffer(включая завершающий ноль), превыситbufsz.
printf_s, fprintf_s, sprintf_s и snprintf_s гарантированно доступны только в том случае, если __STDC_LIB_EXT1__ определён реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 до включения <stdio.h>.Параметры
| stream | - | выходной файловый поток для записи |
| buffer | - | указатель на строку символов для записи |
| bufsz | - | может быть записано до bufsz - 1 символов, плюс завершающий ноль
|
| format | - | указатель на байтовую строку, завершающуюся нулём, указывающую, как интерпретировать данные |
| ... | - | аргументы, задающие данные для печати. Если какой-либо аргумент после продвижения аргументов по умолчанию не имеет типа, ожидаемого соответствующей спецификацией преобразования (ожидаемый тип — это продвинутый тип или совместимый с ним тип), или если аргументов меньше, чем требуется format, поведение не определено. Если аргументов больше, чем требуется format, лишние аргументы вычисляются и игнорируются.
|
Строка format состоит из обычных байтовых символов (кроме %), которые копируются без изменений в выходной поток, и спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
- вводный символ
%.
- вводный символ
- (необязательно) один или несколько флагов, изменяющих поведение преобразования:
-: результат преобразования выравнивается по левому краю поля (по умолчанию — по правому).+: знак знаковых преобразований всегда добавляется перед результатом преобразования (по умолчанию результат предваряется минусом только тогда, когда он отрицательный).- пробел: если результат знакового преобразования не начинается со знака или пуст, перед результатом добавляется пробел. Игнорируется, если присутствует флаг
+. #: выполняется альтернативная форма преобразования. См. таблицу ниже для точных эффектов; в противном случае поведение не определено.0: для преобразований целых чисел и чисел с плавающей запятой для заполнения поля используются ведущие нули вместо символов пробел. Для целых чисел игнорируется, если явно указана точность. Для других преобразований использование этого флага приводит к неопределённому поведению. Игнорируется, если присутствует флаг-.
- (необязательно) целое число или
*, задающее минимальную ширину поля. Результат дополняется символами пробел (по умолчанию), если необходимо, слева при выравнивании по правому краю или справа при выравнивании по левому. В случае использования*ширина задаётся дополнительным аргументом типаint, который появляется перед аргументом, подлежащим преобразованию, и перед аргументом, задающим точность, если он указан. Если значение аргумента отрицательно, это приводит к указанию флага-и положительной ширине поля (Примечание: это минимальная ширина; значение никогда не усекается).
- (необязательно) целое число или
- (необязательно)
.за которым следует целое число или*, или ни то, ни другое, что задаёт точность преобразования. В случае использования*точность задаётся дополнительным аргументом типаint, который появляется перед аргументом, подлежащим преобразованию, но после аргумента, задающего минимальную ширину поля, если он указан. Если значение этого аргумента отрицательно, оно игнорируется. Если не используется ни число, ни*, точность принимается равной нулю. См. таблицу ниже для точных эффектов точности.
- (необязательно)
- (необязательно) модификатор длины, задающий размер аргумента (в комбинации со спецификатором формата преобразования он определяет тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Преобразование Спецификатор |
Объяснение | Ожидаемый Тип аргумента | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ | hh | h | нет | l | ll | j | z | t | L | |
| Доступно только начиная с C99→ | Да | Да | Да | Да | Да | |||||
%
|
Записывает литерал %. Полная спецификация преобразования должна быть %%.
|
Н/П | Н/П | Н/П | Н/П | Н/П | Н/П | Н/П | Н/П | Н/П |
c
|
Записывает один символ.
|
Н/П | Н/П | int |
wint_t |
Н/П | Н/П | Н/П | Н/П | Н/П |
s
|
Записывает строку символов.
|
Н/П | Н/П | char* |
wchar_t* |
Н/П | Н/П | Н/П | Н/П | Н/П |
di
|
Преобразует целое число со знаком в десятичное представление [-]dddd.
|
signed char |
short |
int |
long |
long long |
intmax_t |
※ |
ptrdiff_t |
Н/П |
bB (необязательно)
(C23) |
Преобразует целое число без знака в двоичное представление bbbb.
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
unsigned версия ptrdiff_t |
Н/П |
o
|
Преобразует целое число без знака в восьмеричное представление oooo.
|
Н/П | ||||||||
xX
|
Преобразует целое число без знака в шестнадцатеричное представление hhhh.
|
Н/П | ||||||||
u
|
Преобразует целое число без знака в десятичное представление dddd.
|
Н/П | ||||||||
fF (C99)
|
Преобразует число с плавающей запятой в десятичную запись в стиле [-]ddd.ddd.
|
Н/П | Н/П | double |
double (C99) |
Н/П | Н/П | Н/П | Н/П | long double |
eE
|
Преобразует число с плавающей запятой в экспоненциальную запись с десятичным порядком.
|
Н/П | Н/П | Н/П | Н/П | Н/П | Н/П | |||
aA
(C99) |
Преобразует число с плавающей запятой в экспоненциальную запись с шестнадцатеричным порядком.
|
Н/П | Н/П | Н/П | Н/П | Н/П | Н/П | |||
gG
|
Преобразует число с плавающей запятой в десятичную или экспоненциальную запись в зависимости от значения и точности.
|
Н/П | Н/П | Н/П | Н/П | Н/П | Н/П | |||
n
|
Возвращает количество записанных символов на данный момент этим вызовом функции.
|
signed char* |
short* |
int* |
long* |
long long* |
intmax_t * |
※ |
ptrdiff_t * |
Н/П |
p
|
Записывает определяемую реализацией последовательность символов, задающую указатель. |
Н/П | Н/П | void* |
Н/П | Н/П | Н/П | Н/П | Н/П | Н/П |
| Примечания | ||||||||||
|
Функции преобразования с плавающей запятой преобразуют бесконечность в Не-число преобразуется в Преобразования Спецификатор преобразования, используемый для печати Правильные спецификации преобразования для целочисленных типов с фиксированной шириной (int8_t и т.д.) определены в заголовке <inttypes.h> (хотя PRIdMAX, PRIuMAX и т.д. являются синонимами для Спецификатор преобразования, записывающий в память Существует точка последовательности после действия каждого спецификатора преобразования; это позволяет сохранять несколько результатов Если спецификация преобразования недопустима, поведение не определено. | ||||||||||
Возвращаемое значение
buffer (не считая завершающего нулевого символа), или отрицательное значение, если произошла ошибка кодирования (для строковых и символьных спецификаторов преобразования).buffer, если бы bufsz был проигнорирован, или отрицательное значение, если произошла ошибка кодирования (для строковых и символьных спецификаторов преобразования).buffer, не считая нулевого символа (который всегда записывается, если только buffer не является нулевым указателем, а bufsz не равно нулю и не больше RSIZE_MAX), или ноль при нарушениях ограничений времени выполнения, и отрицательное значение при ошибках кодирования.buffer не является нулевым указателем, а bufsz не равно нулю и не больше RSIZE_MAX), которые были бы записаны в buffer, если бы bufsz был проигнорирован, или отрицательное значение, если произошло нарушение ограничений времени выполнения или ошибка кодирования.Примечания
Стандарт C и POSIX определяют, что поведение sprintf и его вариантов не определено, когда аргумент перекрывается с целевым буфером. Пример:
sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behaviorPOSIX определяет, что при ошибке устанавливается errno. Он также определяет дополнительные спецификации преобразования, в первую очередь поддержку переупорядочивания аргументов (n$ сразу после % указывает на n-й аргумент).
Вызов snprintf с нулевым bufsz и нулевым указателем для buffer полезен для определения необходимого размера буфера для размещения вывода:
const char fmt[] = "sqrt(2) = %f";
int sz = snprintf(NULL, 0, fmt, sqrt(2));
char buf[sz + 1]; // note +1 for terminating null byte
snprintf(buf, sizeof buf, fmt, sqrt(2));snprintf_s, как и snprintf, но в отличие от sprintf_s, усекает вывод, чтобы он поместился в bufsz - 1.
Пример
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
int main(void)
{
const char* s = "Hello";
printf("Strings:\n"); // same as puts("Strings");
printf(" padding:\n");
printf("\t[%10s]\n", s);
printf("\t[%-10s]\n", s);
printf("\t[%*s]\n", 10, s);
printf(" truncating:\n");
printf("\t%.4s\n", s);
printf("\t%.*s\n", 3, s);
printf("Characters:\t%c %%\n", 'A');
printf("Integers:\n");
printf("\tDecimal:\t%i %d %.6i %i %.0i %+i %i\n",
1, 2, 3, 0, 0, 4,-4);
printf("\tHexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6);
printf("\tOctal:\t\t%o %#o %#o\n", 10, 10, 4);
printf("Floating-point:\n");
printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
printf("\tScientific:\t%E %e\n", 1.5, 1.5);
printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5);
printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0 / 0.0, 1.0 / 0.0);
printf("Fixed-width types:\n");
printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n",
UINT32_MAX, UINT32_MAX );
}Возможный вывод:
Strings:
padding:
[ Hello]
[Hello ]
[ Hello]
truncating:
Hell
Hel
Characters: A %
Integers:
Decimal: 1 2 000003 0 +4 -4
Hexadecimal: 5 a A 0x6
Octal: 12 012 04
Floating-point:
Rounding: 1.500000 2 1.30000000000000004440892098500626
Padding: 01.50 1.50 1.50
Scientific: 1.500000E+00 1.500000e+00
Hexadecimal: 0x1.8p+0 0X1.8P+0
Special values: 0/0=-nan 1/0=inf
Fixed-width types:
Largest 32-bit value is 4294967295 or 0xffffffffСсылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.21.6.1 Функция fprintf (стр.: TBD)
- 7.21.6.3 Функция printf (стр.: TBD)
- 7.21.6.5 Функция snprintf (стр.: TBD)
- 7.21.6.6 Функция sprintf (стр.: TBD)
- K.3.5.3.1 Функция fprintf_s (стр.: TBD)
- K.3.5.3.3 Функция printf_s (стр.: TBD)
- K.3.5.3.5 Функция snprintf_s (стр.: TBD)
- K.3.5.3.6 Функция sprintf_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.21.6.1 Функция fprintf (стр.: 225-230)
- 7.21.6.3 Функция printf (стр.: 236)
- 7.21.6.5 Функция snprintf (стр.: 237)
- 7.21.6.6 Функция sprintf (стр.: 237)
- K.3.5.3.1 Функция fprintf_s (стр.: 430)
- K.3.5.3.3 Функция printf_s (стр.: 432)
- K.3.5.3.5 Функция snprintf_s (стр.: 432-433)
- K.3.5.3.6 Функция sprintf_s (стр.: 433)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.21.6.1 Функция fprintf (стр.: 309-316)
- 7.21.6.3 Функция printf (стр.: 324)
- 7.21.6.5 Функция snprintf (стр.: 325)
- 7.21.6.6 Функция sprintf (стр.: 325-326)
- K.3.5.3.1 Функция fprintf_s (стр.: 591)
- K.3.5.3.3 Функция printf_s (стр.: 593-594)
- K.3.5.3.5 Функция snprintf_s (стр.: 594-595)
- K.3.5.3.6 Функция sprintf_s (стр.: 595-596)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.19.6.1 Функция fprintf (стр.: 274-282)
- 7.19.6.3 Функция printf (стр.: 290)
- 7.19.6.5 Функция snprintf (стр.: 290-291)
- 7.19.6.6 Функция sprintf (стр.: 291)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.9.6.1 Функция fprintf
- 4.9.6.3 Функция printf
- 4.9.6.5 Функция sprintf
См. также
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
печатает форматированный широкий символьный вывод в stdout, файловый поток или буфер (функция) |
(C99)(C11)(C11)(C11)(C11) |
печатает форматированный вывод в stdout, файловый поток или буфер используя список аргументов переменного числа (функция) |
| записывает строку символов в файловый поток (функция) | |
(C11)(C11)(C11) |
читает форматированный ввод из stdin, файлового потока или буфера (функция) |
Документация C++ для printf, fprintf, sprintf, snprintf
| |