vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
| Определено в заголовке <stdio.h>
|
||
int vprintf( const char* format, va_list vlist );
|
(1) | (до C99) |
int vprintf( const char* restrict format, va_list vlist );
|
(начиная с C99) | |
int vfprintf( FILE* stream, const char* format, va_list vlist );
|
(2) | (до C99) |
int vfprintf( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(начиная с C99) | |
int vsprintf( char* buffer, const char* format, va_list vlist );
|
(3) | (до C99) |
int vsprintf( char* restrict buffer, const char* restrict format,
va_list vlist );
|
(начиная с C99) | |
int vsnprintf( char* restrict buffer, size_t bufsz,
const char* restrict format, va_list vlist );
|
(4) | (начиная с C99) |
int vprintf_s( const char* restrict format, va_list vlist );
|
(5) | (начиная с C11) |
int vfprintf_s( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(6) | (начиная с C11) |
int vsprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, va_list vlist );
|
(7) | (начиная с C11) |
int vsnprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, va_list vlist );
|
(8) | (начиная с C11) |
Загружает данные из местоположений, заданных vlist, преобразует их в строковые эквиваленты и записывает результаты в различные приёмники.
stream.buffer.buffer. Записывается не более bufsz - 1 символов. Результирующая строка будет завершена нулевым символом, если только bufsz не равно нулю. Если bufsz равно нулю, ничего не записывается, и buffer может быть нулевым указателем, однако возвращаемое значение (количество байтов, которое было бы записано без учёта завершающего нулевого символа) всё равно вычисляется и возвращается.- спецификатор преобразования
%nприсутствует вformat - любой из аргументов, соответствующих
%s, является нулевым указателем formatилиbufferявляется нулевым указателемbufszравно нулю или больше RSIZE_MAX- возникают ошибки кодирования в любом из спецификаторов преобразования строк и символов
- (только для
vsprintf_s), строка для сохранения вbuffer(включая завершающий ноль) превысила быbufsz
vprintf_s, vfprintf_s, vsprintf_s и vsnprintf_s гарантированно доступны только в том случае, если __STDC_LIB_EXT1__ определена реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h>.Параметры
| stream | - | выходной файловый поток для записи |
| buffer | - | указатель на строку символов для записи |
| bufsz | - | может быть записано до bufsz - 1 символов, плюс завершающий ноль
|
| format | - | указатель на строку символов, завершающуюся нулём, определяющую, как интерпретировать данные |
| vlist | - | список переменных аргументов, содержащий данные для печати. |
Строка format состоит из обычных байтовых символов (кроме %), которые копируются без изменений в выходной поток, и спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
- вводный символ
%.
- вводный символ
- (необязательно) один или несколько флагов, изменяющих поведение преобразования:
-: результат преобразования выравнивается по левому краю поля (по умолчанию выравнивается по правому краю).+: знак преобразования со знаком всегда добавляется перед результатом преобразования (по умолчанию результату предшествует минус, только если он отрицательный).- space: если результат преобразования со знаком не начинается со знакового символа или пуст, перед результатом добавляется пробел. Игнорируется, если присутствует флаг
+. #: выполняется альтернативная форма преобразования. Точные эффекты см. в таблице ниже, в противном случае поведение не определено.0: для целочисленных преобразований и преобразований чисел с плавающей запятой для заполнения поля используются ведущие нули вместо символов space. Для целых чисел игнорируется, если явно указана точность. Для других преобразований использование этого флага приводит к неопределённому поведению. Игнорируется, если присутствует флаг-.
- (необязательно) целое значение или
*, которое задаёт минимальную ширину поля. Результат при необходимости дополняется символами space слева при выравнивании по правому краю или справа при выравнивании по левому краю. В случае использования*ширина задаётся дополнительным аргументом типаint, который появляется перед преобразуемым аргументом и аргументом, задающим точность, если он указан. Если значение аргумента отрицательное, это приводит к указанию флага-и положительной ширины поля (Примечание: это минимальная ширина: значение никогда не усекается).
- (необязательно) целое значение или
- (необязательно)
.за которым следует целое число или*, или ни то, ни другое, что определяет точность преобразования. В случае использования*точность задаётся дополнительным аргументом типаint, который появляется перед преобразуемым аргументом, но после аргумента, задающего минимальную ширину поля, если он указан. Если значение этого аргумента отрицательное, оно игнорируется. Если не используется ни число, ни*, точность принимается равной нулю. Точные эффекты точности см. в таблице ниже.
- (необязательно)
- (необязательно) модификатор длины, который определяет размер аргумента (в сочетании со спецификатором формата преобразования он определяет тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор Преобразования |
Пояснение | Ожидаемый Тип аргумента | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ | hh | h | нет | l | ll | j | z | t | L | |
| Доступно только начиная с C99→ | Да | Да | Да | Да | Да | |||||
%
|
Выводит литерал %. Полная спецификация преобразования должна быть %%.
|
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
Выводит один символ.
|
N/A | N/A | int |
wint_t |
N/A | N/A | N/A | N/A | N/A |
s
|
Выводит строку символов.
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
di
|
Преобразует целое число со знаком в десятичное представление [-]dddd.
|
signed char |
short |
int |
long |
long long |
intmax_t |
※ |
ptrdiff_t |
N/A |
bB (необязательно)
(C23) |
Преобразует целое число без знака в двоичное представление bbbb.
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
версия без знака ptrdiff_t |
N/A |
o
|
Преобразует целое число без знака в восьмеричное представление oooo.
|
N/A | ||||||||
xX
|
Преобразует целое число без знака в шестнадцатеричное представление hhhh.
|
N/A | ||||||||
u
|
Преобразует целое число без знака в десятичное представление dddd.
|
N/A | ||||||||
fF (C99)
|
Преобразует число с плавающей запятой в десятичную запись в стиле [-]ddd.ddd.
|
N/A | N/A | double |
double (C99) |
N/A | N/A | N/A | N/A | long double |
eE
|
Преобразует число с плавающей запятой в десятичную экспоненциальную запись.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C99) |
Преобразует число с плавающей запятой в шестнадцатеричную экспоненциальную запись.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
Преобразует число с плавающей запятой в десятичную или десятичную экспоненциальную запись в зависимости от значения и точности.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
Возвращает количество записанных символов на данный момент этим вызовом функции.
|
signed char* |
short* |
int* |
long* |
long long* |
intmax_t * |
※ |
ptrdiff_t * |
N/A |
p
|
Записывает определяемую реализацией последовательность символов, определяющую указатель. |
N/A | N/A | void* |
N/A | N/A | N/A | N/A | N/A | N/A |
| Примечания | ||||||||||
|
Функции преобразования чисел с плавающей запятой преобразуют бесконечность в NaN преобразуется в Преобразования Спецификатор преобразования, используемый для печати Правильные спецификации преобразования для символьных типов фиксированной ширины (int8_t и т. д.) определены в заголовке <inttypes.h> (хотя PRIdMAX, PRIuMAX и т. д. являются синонимами Спецификатор преобразования, записывающий в память, Существует точка следования после действия каждого спецификатора преобразования; это позволяет сохранять несколько результатов Если спецификация преобразования недействительна, поведение не определено. | ||||||||||
Возвращаемое значение
buf_size, функция возвращает общее количество символов (не включая завершающий нулевой байт), которое было бы записано, если бы ограничение не было наложено.buffer, не считая нулевого символа (который всегда записывается, если только buffer не является нулевым указателем, а bufsz не равно нулю и не больше RSIZE_MAX), или ноль при нарушениях ограничений времени выполнения и отрицательное значение при ошибках кодированияbuffer не является нулевым указателем, а bufsz не равно нулю и не больше RSIZE_MAX), которые были бы записаны в buffer, если бы bufsz игнорировался, или отрицательное значение, если произошло нарушение ограничений времени выполнения или ошибка кодированияПримечания
Все эти функции вызывают va_arg хотя бы один раз; значение arg неопределено после возврата. Эти функции не вызывают va_end, это должен сделать вызывающий.
vsnprintf_s, в отличие от vsprintf_s, усечёт результат, чтобы он поместился в массив, указанный buffer.
Реализация vsnprintf_s в Microsoft CRT не соответствует стандарту C. Версия Microsoft имеет дополнительный параметр size_t count на третьей позиции, который содержит максимальное количество символов для записи, не включая завершающий ноль. Этот параметр может отличаться от размера буфера, заданного параметром size_t bufsz.
Пример
#include <stdarg.h>
#include <stdio.h>
#include <time.h>
void debug_log(const char* fmt, ...)
{
struct timespec ts;
timespec_get(&ts, TIME_UTC);
char time_buf[100];
size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec));
snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000);
va_list args1;
va_start(args1, fmt);
va_list args2;
va_copy(args2, args1);
char buf[1+vsnprintf(NULL, 0, fmt, args1)];
va_end(args1);
vsnprintf(buf, sizeof buf, fmt, args2);
va_end(args2);
printf("%s [debug]: %s\n", time_buf, buf);
}
int main(void)
{
debug_log("Logging, %d, %d, %d", 1, 2, 3);
}Возможный вывод:
02/20/15 21:58:09.072683 UTC [debug]: Logging, 1, 2, 3Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.21.6.8 Функция vfprintf (p: TBD)
- 7.21.6.10 Функция vprintf (p: TBD)
- 7.21.6.12 Функция vsnprintf (p: TBD)
- 7.21.6.13 Функция vsprintf (p: TBD)
- K.3.5.3.8 Функция vfprintf_s (p: TBD)
- K.3.5.3.10 Функция vprintf_s (p: TBD)
- K.3.5.3.12 Функция vsnprintf_s (p: TBD)
- K.3.5.3.13 Функция vsprintf_s (p: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.21.6.8 Функция vfprintf (p: 238)
- 7.21.6.10 Функция vprintf (p: 239)
- 7.21.6.12 Функция vsnprintf (p: 239-240)
- 7.21.6.13 Функция vsprintf (p: 240)
- K.3.5.3.8 Функция vfprintf_s (p: 434)
- K.3.5.3.10 Функция vprintf_s (p: 435)
- K.3.5.3.12 Функция vsnprintf_s (p: 436-437)
- K.3.5.3.13 Функция vsprintf_s (p: 437)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.21.6.8 Функция vfprintf (p: 326-327)
- 7.21.6.10 Функция vprintf (p: 328)
- 7.21.6.12 Функция vsnprintf (p: 329)
- 7.21.6.13 Функция vsprintf (p: 329)
- K.3.5.3.8 Функция vfprintf_s (p: 597)
- K.3.5.3.10 Функция vprintf_s (p: 598-599)
- K.3.5.3.12 Функция vsnprintf_s (p: 600)
- K.3.5.3.13 Функция vsprintf_s (p: 601)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.19.6.8 Функция vfprintf (p: 292)
- 7.19.6.10 Функция vprintf (p: 293)
- 7.19.6.12 Функция vsnprintf (p: 294)
- 7.19.6.13 Функция vsprintf (p: 295)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.9.6.7 Функция vfprintf
- 4.9.6.8 Функция vprintf
- 4.9.6.9 Функция vsprintf
См. также
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
выводит форматированный широкий символьный вывод в stdout, файловый поток или буфер, используя список переменных аргументов (функция) |
(C99)(C11)(C11)(C11)(C11) |
выводит форматированный вывод в stdout, файловый поток или буфер (функция) |
(C99)(C99)(C99)(C11)(C11)(C11) |
читает форматированный ввод из stdin, файлового потока или буфера с использованием списка переменных аргументов (функция) |
Документация C++ для vprintf, vfprintf, vsprintf, vsnprintf
| |