std::vwprintf, std::vfwprintf, std::vswprintf
Определено в заголовочном файле <cwchar> | ||
|---|---|---|
int vwprintf( const wchar_t* format, va_list vlist ); | (1) | |
int vfwprintf( std::FILE* stream, const wchar_t* format, va_list vlist ); | (2) | |
int vswprintf( wchar_t* buffer, std::size_t buf_size, const wchar_t* format, va_list vlist ); | (3) |
Загружает данные из мест, определённых vlist, преобразует их в эквиваленты широких строк и записывает результаты в различные стоки.
stdout.stream.buffer. Максимальное количество записываемых символов — size-1, после чего записывается нулевой символ.Параметры
| stream | - | вывод широкого потока для записи |
| buffer | - | указатель на широкую строку для записи |
| buf_size | - | максимальное количество широких символов для записи |
| format | - | указатель на завершающуюся нулём широкую строку, определяющую, как интерпретировать данные |
| vlist | - | список переменных аргументов, содержащий данные для вывода. |
Строка format состоит из обычных широких символов (кроме %), которые копируются без изменений в выходной поток, и спецификаторов преобразования. Каждый спецификатор преобразования имеет следующий формат:
- вводящий символ
%. - (необязательно) один или несколько флагов, которые изменяют поведение преобразования:
-
-: результат преобразования выравнивается слева в поле (по умолчанию — справа). -
+: знак для знаковых преобразований всегда предшествует результату преобразования (по умолчанию результату предшествует минус только в случае отрицательного значения). - пробел: если результат знакового преобразования не начинается с символа знака или пустой, пробел добавляется перед результатом. Он игнорируется, если присутствует флаг
+. -
#: выполняется альтернативная форма преобразования. Точные эффекты см. в таблице ниже, в противном случае поведение не определено. -
0: для целочисленных и чисел с плавающей точкой, ведущие нули используются для заполнения поля вместо пробелов. Для целочисленных значений он игнорируется, если явным образом указана точность. Для других преобразований использование этого флага приводит к неопределённому поведению. Он игнорируется, если присутствует флаг-. - (необязательно) целое значение или
*, которые определяют минимальную ширину поля. Результат дополняется пробелами (по умолчанию), если необходимо, слева при правом выравнивании или справа при левом выравнивании. В случае использования*, ширина указывается дополнительным аргументом типаint, который предшествует преобразуемому аргументу и аргументу, задающему точность, если она указана. Если значение аргумента отрицательно, оно приводит к указанию флага-и положительной ширине поля (Примечание: Это минимальная ширина: значение никогда не усекается). - (необязательно)
., за которым следует целое число или*, или ни то, ни другое, что определяет точность преобразования. В случае использования*, точность указывается дополнительным аргументом типаint, который предшествует преобразуемому аргументу, но следует аргументу, задающему минимальную ширину поля, если он указан. Если значение этого аргумента отрицательно, оно игнорируется. Если ни число, ни*не используются, точность принимается равной нулю. Точные эффекты точности см. в таблице ниже. - (необязательно) модификатор длины, который определяет размер аргумента (в сочетании со спецификатором формата преобразования, он определяет тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования | Описание | Ожидаемый тип аргумента |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
Модификатор длины→ |
hh (C++11) |
h | (нет) |
l |
ll (C++11) |
j (C++11) |
z (C++11) |
t (C++11) |
L |
|
% | Выводит литерал %. Полная спецификация преобразования должна быть %%. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c | Выводит одиночный символ. Аргумент сначала преобразуется в wchar_t как если бы был вызван btowc. Если используется модификатор l, аргумент wint_t сначала преобразуется в wchar_t. | Н/Д | Н/Д |
int |
wint_t | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s | Выводит строку символов. Аргумент должен быть указателем на начальный элемент массива символов, содержащего многобайтовую последовательность символов, начинающуюся в начальном состоянии сдвига, которая преобразуется в массив широких символов так, как если бы вызов был | Н/Д | Н/Д |
char* |
wchar_t* | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
di | Преобразует целое число со знаком в десятичное представление [-]dddd. Точность определяет минимальное количество цифр. По умолчанию точность равна 1.Если преобразованное значение и точность равны 0, результат преобразования не содержит символов. |
signed char |
short |
int |
long |
long long |
intmax_t |
целое со знаком size_t
|
ptrdiff_t | Н/Д |
o | Преобразует целое число без знака в восьмеричное представление oooo. Точность определяет минимальное количество цифр. По умолчанию точность равна 1. Если преобразованное значение и точность равны 0, результат преобразования не содержит символов. В альтернативной реализации точность увеличивается при необходимости, чтобы вывести ведущий ноль. В этом случае, если преобразованное значение и точность равны 0, выводится одиночный 0. |
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
беззнаковое ptrdiff_t
| Н/Д |
xX | Преобразует целое число без знака в шестнадцатеричное представление hhhh. Для x преобразования используются символы abcdef. Для X преобразования используются символы ABCDEF. Точность определяет минимальное количество цифр. По умолчанию точность равна 1. Если преобразованное значение и точность равны 0, результат преобразования не содержит символов. В альтернативной реализации 0x или 0X добавляется в результат, если преобразованное значение отлично от нуля. | Н/Д | ||||||||
u | Преобразует целое число без знака в десятичное представление dddd. Точность определяет минимальное количество цифр. По умолчанию точность равна 1. Если преобразованное значение и точность равны 0, результат преобразования не содержит символов. | Н/Д | ||||||||
fF | Преобразует число с плавающей точкой в десятичную нотацию в стиле [-]ddd.ddd. Точность определяет точное количество цифр после десятичной точки. По умолчанию точность равна 6. В альтернативной реализации десятичная точка выводится даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания. | Н/Д | Н/Д |
double |
double(C++11)
| Н/Д | Н/Д | Н/Д |
long double |
|
eE | Преобразует число с плавающей точкой в экспоненциальную запись. Для e стиля преобразования используется [-]d.ddde±dd. Для E стиля преобразования используется [-]d.dddE±dd. Экспонента содержит по крайней мере две цифры, больше цифр используются только если необходимо. Если значение равно 0, экспонента также равна 0. Точность определяет точное количество цифр после десятичной точки. По умолчанию точность равна 6. В альтернативной реализации десятичная точка выводится даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | ||||
aA (C++11) | Преобразует число с плавающей точкой в шестнадцатеричную экспоненциальную запись. Для a стиля преобразования используется [-]0xh.hhhp±d. Для A стиля преобразования используется [-]0Xh.hhhP±d. Первая шестнадцатеричная цифра не 0 если аргумент - нормализованное число с плавающей точкой. Если значение равно 0, экспонента также равна 0. Точность определяет точное количество цифр после шестнадцатеричной точки. По умолчанию точность достаточна для точного представления значения. В альтернативной реализации десятичная точка выводится даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | ||||
gG | Преобразует число с плавающей точкой в десятичную или экспоненциальную запись в зависимости от значения и точности. Для g стиля преобразования выполняется преобразование со стилем e или f. Для G стиля преобразования выполняется преобразование со стилем E или F. Пусть P равно точности, если она отлична от нуля, 6 если точность не указана, или 1 если точность 0. Затем, если преобразование со стилем E имело бы экспоненту X: |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
n | Возвращает количество символов, записанных до сих пор этим вызовом функции. Результат записывается в значение, на которое указывает аргумент. Спецификация не может содержать ни флаги, ни ширину поля, ни точность. |
signed char* |
short* |
int* |
long* |
long long* |
intmax_t* |
знаковый size_t*
|
ptrdiff_t* | Н/Д |
|---|---|---|---|---|---|---|---|---|---|---|
p | Записывает определяемую реализацией последовательность символов, задающую указатель. | Н/Д | Н/Д |
void* | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
Функции преобразования чисел с плавающей запятой преобразуют бесконечность в inf или infinity. Какой из них используется, определяется реализацией.
Не-число преобразуется в nan или nan(char_sequence). Какой из них используется, определяется реализацией.
Преобразования F, E, G, A выдают INF, INFINITY, NAN соответственно.
Несмотря на то, что %c ожидает int аргумент, безопасно передавать char, из-за повышения целых чисел, которое происходит при вызове вариативной функции.
Правильные спецификации преобразования для типов символов фиксированной ширины (int8_t, и т.д.) определены в заголовке <cinttypes> (хотя PRIdMAX, PRIuMAX, и т.д. являются синонимами %jd, %ju, и т.д.).
Спецификатор преобразования для записи в память %n является распространённой целью эксплойтов, где строки форматирования зависят от пользовательского ввода, и не поддерживается семейством функций printf_s с проверкой границ.
После действия каждого спецификатора преобразования имеется точка последовательности; это позволяет хранить несколько %n результатов в одной переменной или, как крайний случай, выводить строку, изменённую более ранним %n в том же вызове.
Если спецификатор преобразования некорректен, поведение не определено.
Значение результата
size. Примечания
В то время как узкие строки предоставляют std::vsnprintf, что позволяет определить размер буфера вывода, нет эквивалента для широких строк, и для определения размера буфера программе может потребоваться вызвать std::vswprintf, проверить значение результата и перевыделить больший буфер, пытаясь снова до тех пор, пока это не удастся.
Пример
См. также
|
(C++11) | выводит отформатированный вывод в stdout, потоке файла или буфереиспользуя переменную аргументную цепочку (функция) |
выводит отформатированный вывод широких символов в stdout, поток файла или буфер (функция) |
|
C документация для vwprintf, vfwprintf, vswprintf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/c/vfwprintf