vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s
| Определено в заголовке <wchar.h>
|
||
int vwprintf( const wchar_t* format, va_list vlist );
|
(1) | (начиная с C95) (до C99) |
int vwprintf( const wchar_t* restrict format, va_list vlist );
|
(начиная с C99) | |
int vfwprintf( FILE* stream, const wchar_t* format, va_list vlist );
|
(2) | (начиная с C95) (до C99) |
int vfwprintf( FILE* restrict stream,
const wchar_t* restrict format, va_list vlist );
|
(начиная с C99) | |
int vswprintf( wchar_t* buffer, size_t bufsz,
const wchar_t* format, va_list vlist );
|
(3) | (начиная с C95) (до C99) |
int vswprintf( wchar_t* restrict buffer, size_t bufsz,
const wchar_t* restrict format, va_list vlist );
|
(начиная с C99) | |
int vwprintf_s( const wchar_t* restrict format, va_list vlist);
|
(4) | (начиная с C11) |
int vfwprintf_s( FILE* restrict stream,
const wchar_t* restrict format, va_list vlist);
|
(5) | (начиная с C11) |
int vswprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
const wchar_t* restrict format, va_list vlist);
|
(6) | (начиная с C11) |
int vsnwprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
const wchar_t* restrict format, va_list vlist);
|
(7) | (начиная с C11) |
Загружает данные из местоположений, заданных vlist, преобразует их в широкие строковые эквиваленты и записывает результаты в различные приемники.
stream.buffer. Записывается не более bufsz - 1 широких символов, за которыми следует нулевой широкий символ. Результирующая строка широких символов будет завершена нулевым широким символом, если только bufsz не равно нулю.- спецификатор преобразования
%nприсутствует вformat - любой из аргументов, соответствующих
%s, является нулевым указателем formatилиbufferявляется нулевым указателемbufszравно нулю или большеRSIZE_MAX / sizeof(wchar_t)- ошибки кодирования возникают в любых спецификаторах преобразования строк и символов
- (только для
vswprintf_s), строка, подлежащая сохранению вbuffer(включая завершающий нулевой широкий символ), будет превышатьbufsz.
buffer.vwprintf_s, vfwprintf_s, vswprintf_s и vsnwprintf_s гарантированно доступны только в том случае, если __STDC_LIB_EXT1__ определена реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h>.Параметры
| stream | - | выходной широкий поток для записи |
| buffer | - | указатель на широкую строку для записи |
| bufsz | - | максимальное число широких символов для записи |
| format | - | указатель на нуль-терминированную широкую строку, определяющую, как интерпретировать данные |
| vlist | - | список аргументов переменной длины, содержащий данные для печати. |
Строка format состоит из обычных широких символов (за исключением %), которые копируются без изменений в выходной поток, и спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
- вводный символ
%.
- вводный символ
- (необязательно) один или несколько флагов, изменяющих поведение преобразования:
-: результат преобразования выравнивается по левому краю поля (по умолчанию — по правому).+: знак знаковых преобразований всегда добавляется к результату преобразования (по умолчанию результат предваряется минусом только в случае отрицательного значения).- пробел: если результат знакового преобразования не начинается со знакового символа или пуст, перед результатом добавляется пробел. Игнорируется, если присутствует флаг
+. #: выполняется альтернативная форма преобразования. Подробные эффекты см. в таблице ниже, в противном случае поведение не определено.0: для преобразований целых чисел и чисел с плавающей запятой для заполнения поля вместо символов пробел используются начальные нули. Для целых чисел игнорируется, если явно указана точность. Для других преобразований использование этого флага приводит к неопределенному поведению. Игнорируется, если присутствует флаг-.
- (необязательно) целое значение или
*, которое задает минимальную ширину поля. Результат дополняется символами пробел (по умолчанию), если необходимо, слева при выравнивании по правому краю или справа при выравнивании по левому. В случае использования*ширина задается дополнительным аргументом типаint, который появляется перед аргументом, подлежащим преобразованию, и аргументом, предоставляющим точность, если таковая указана. Если значение аргумента отрицательно, это приводит к указанию флага-и положительной ширины поля (Примечание: Это минимальная ширина: значение никогда не усекается.).
- (необязательно) целое значение или
- (необязательно)
.за которым следует целое число или*, или ничего, что задает точность преобразования. В случае использования*точность задается дополнительным аргументом типаint, который появляется перед аргументом, подлежащим преобразованию, но после аргумента, предоставляющего минимальную ширину поля, если таковой указан. Если значение этого аргумента отрицательно, оно игнорируется. Если не используется ни число, ни*, точность принимается равной нулю. Подробные эффекты точности см. в таблице ниже.
- (необязательно)
- (необязательно) модификатор длины, который задает размер аргумента (в сочетании со спецификатором формата преобразования он определяет тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Преобразование Спецификатор |
Пояснение | Ожидаемый Тип аргумента | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ | hh | h | none | 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 |
беззнаковая версия 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 и т.д. являются синонимами Спецификатор преобразования, записывающий в память Существует точка последовательности после действия каждого спецификатора преобразования; это позволяет сохранять несколько результатов Если спецификация преобразования недействительна, поведение не определено. | ||||||||||
Возвращаемое значение
bufsz, функция возвращает общее количество символов (не включая завершающий нулевой широкий символ), которое было бы записано, если бы ограничение не было наложено.buffer, не считая нулевого широкого символа (который всегда записывается, если buffer не является нулевым указателем и bufsz не равно нулю и не больше RSIZE_MAX/sizeof(wchar_t)), или ноль при нарушениях ограничений времени выполнения, и отрицательное значение при ошибках кодирования.buffer не является нулевым указателем и bufsz не равно нулю и не больше RSIZE_MAX/sizeof(wchar_t)), которое было бы записано в buffer, если бы bufsz игнорировался, или отрицательное значение, если произошло нарушение ограничений времени выполнения или ошибка кодирования.Примечания
Все эти функции вызывают va_arg по крайней мере один раз, значение arg неопределено после возврата. Эти функции не вызывают va_end, и это должен сделать вызывающий.
В то время как узкие строки предоставляют vsnprintf, что позволяет определить необходимый размер выходного буфера, для широких строк нет эквивалента (до C11 vsnwprintf_s), и для определения размера буфера программа может вызвать vswprintf, проверить возвращаемое значение и перераспределить больший буфер, повторяя попытку до успеха.
vsnwprintf_s, в отличие от vswprintf_s, обрежет результат, чтобы он поместился в массив, на который указывает buffer, даже несмотря на то, что усечение рассматривается как ошибка большинством функций с проверкой границ.
Пример
#include <locale.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
void debug_wlog(const wchar_t* 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 args;
va_start(args, fmt);
wchar_t buf[1024];
int rc2 = vswprintf(buf, sizeof buf / sizeof *buf, fmt, args);
va_end(args);
if (rc2 > 0)
wprintf(L"%s [debug]: %ls\n", time_buf, buf);
else
wprintf(L"%s [debug]: (string too long)\n", time_buf);
}
int main(void)
{
setlocale(LC_ALL, "");
debug_wlog(L"Logging, %d, %d, %d", 1, 2, 3);
}
Возможный вывод:
02/20/15 22:12:38.476575 UTC [debug]: Logging, 1, 2, 3
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.29.2.5 Функция vfwprintf (стр.: TBD)
- 7.29.2.7 Функция vswprintf (стр.: TBD)
- 7.29.2.9 Функция vwprintf (стр.: TBD)
- K.3.9.1.6 Функция vfwprintf_s (стр.: TBD)
- K.3.9.1.8 Функция vsnwprintf_s (стр.: TBD)
- K.3.9.1.9 Функция vswprintf_s (стр.: TBD)
- K.3.9.1.11 Функция vwprintf_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.29.2.5 Функция vfwprintf (стр.: TBD)
- 7.29.2.7 Функция vswprintf (стр.: TBD)
- 7.29.2.9 Функция vwprintf (стр.: TBD)
- K.3.9.1.6 Функция vfwprintf_s (стр.: TBD)
- K.3.9.1.8 Функция vsnwprintf_s (стр.: TBD)
- K.3.9.1.9 Функция vswprintf_s (стр.: TBD)
- K.3.9.1.11 Функция vwprintf_s (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.29.2.5 Функция vfwprintf (стр.: 417-418)
- 7.29.2.7 Функция vswprintf (стр.: 419)
- 7.29.2.9 Функция vwprintf (стр.: 420)
- K.3.9.1.6 Функция vfwprintf_s (стр.: 632)
- K.3.9.1.8 Функция vsnwprintf_s (стр.: 633-634)
- K.3.9.1.9 Функция vswprintf_s (стр.: 634-635)
- K.3.9.1.11 Функция vwprintf_s (стр.: 636)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.24.2.5 Функция vfwprintf (стр.: 363)
- 7.24.2.7 Функция vswprintf (стр.: 364)
- 7.24.2.9 Функция vwprintf (стр.: 365)
См. также
(C99)(C11)(C11)(C11)(C11) |
печатает форматированный вывод в stdout, файловый поток или буфер с использованием списка аргументов переменной длины (функция) |
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
печатает форматированный вывод широких символов в stdout, файловый поток или буфер (функция) |
Документация C++ по vwprintf, vfwprintf, vswprintf
| |