Namespaces
Variants

std:: vwprintf, std:: vfwprintf, std:: vswprintf

From cppreference.net
< cpp ‎ | io ‎ | c
Определено в заголовочном файле <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 , преобразует их в эквиваленты широких строк и записывает результаты в различные приемники.

1) Записывает результаты в stdout .
2) Записывает результаты в файловый поток stream .
3) Записывает результаты в широкую строку buffer . Записывается не более size - 1 широких символов, за которыми следует нулевой широкий символ.

Содержание

Параметры

stream - выходной широкий поток для записи
buffer - указатель на широкую строку для записи
buf_size - максимальное количество широких символов для записи
format - указатель на широкую строку с нулевым завершением, определяющую способ интерпретации данных
vlist - variable argument list содержащий данные для вывода.


Строка формата состоит из обычных широких символов (за исключением % ), которые копируются без изменений в выходной поток, и спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:

  • вводный % символ.
  • (необязательно) один или несколько флагов, изменяющих поведение преобразования:
  • - : результат преобразования выравнивается по левому краю в пределах поля (по умолчанию выравнивается по правому краю).
  • + : знак знаковых преобразований всегда добавляется перед результатом преобразования (по умолчанию результат предваряется минусом только когда он отрицательный).
  • space : если результат знакового преобразования не начинается с символа знака или является пустым, перед результатом добавляется пробел. Игнорируется если присутствует флаг + .
  • # : альтернативная форма преобразования выполняется. Смотрите таблицу ниже для точных эффектов, иначе поведение не определено.
  • 0 : для целочисленных и преобразований чисел с плавающей точкой, ведущие нули используются для заполнения поля вместо символов space . Для целых чисел игнорируется если точность явно указана. Для других преобразований использование этого флага приводит к неопределенному поведению. Игнорируется если присутствует флаг - .
  • (необязательно) целочисленное значение или * , определяющее минимальную ширину поля. Результат дополняется символами пробела (по умолчанию) при необходимости слева при выравнивании по правому краю или справа при выравнивании по левому краю. В случае использования * , ширина задается дополнительным аргументом типа int , который указывается перед аргументом для преобразования и аргументом, задающим точность, если он предоставлен. Если значение аргумента отрицательное, это приводит к указанию флага - и положительной ширине поля (Примечание: Это минимальная ширина: значение никогда не усекается.).
  • (необязательно) . за которым следует целое число или * , либо ничего, что определяет точность преобразования. В случае, когда используется * , точность задается дополнительным аргументом типа int , который указывается перед преобразуемым аргументом, но после аргумента, задающего минимальную ширину поля, если таковой указан. Если значение этого аргумента отрицательное, оно игнорируется. Если не указано ни число, ни * , точность принимается равной нулю. Смотрите таблицу ниже для точных эффектов точности .
  • (необязательный) модификатор длины который указывает размер аргумента (в сочетании со спецификатором формата преобразования он определяет тип соответствующего аргумента).
  • спецификатор формата преобразования.

Доступны следующие спецификаторы формата:

Спецификатор
преобразования
Объяснение Ожидаемый
тип аргумента
Модификатор длины→ hh h нет l ll j z t L
Доступно только с C++11→ Да Да Да Да Да
% Выводит символ % . Полная спецификация преобразования должна быть %% . N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

Записывает один символ .

  • Аргумент сначала преобразуется в wchar_t как если бы вызывалась функция std::btowc .
  • Если используется модификатор l , аргумент типа std::wint_t сначала преобразуется в wchar_t .
N/A N/A
int
std::wint_t
N/A N/A N/A N/A N/A
s

Записывает строку символов .

  • Аргумент должен быть указателем на начальный элемент массива символов, содержащего многобайтовую последовательность символов, начинающуюся в начальном состоянии сдвига, которая преобразуется в массив широких символов как при вызове std::mbrtowc с обнуленным состоянием преобразования.
  • Точность определяет максимальное количество широких символов для записи. Если Точность не указана, записываются все широкие символы до первого нулевого терминатора (исключая его).
  • Если используется спецификатор l , аргумент должен быть указателем на начальный элемент массива wchar_t .
N/A N/A
char *
wchar_t *
N/A N/A N/A N/A N/A
d
i

Преобразует знаковое целое число в десятичное представление [-]dddd .

  • Точность определяет минимальное количество отображаемых цифр. Точность по умолчанию равна 1 .
  • Если и преобразованное значение, и точность равны 0 , преобразование не выводит символов.
  • Для модификатора z ожидаемый тип аргумента - знаковая версия std::size_t .
signed char
short
int
long
long long
N/A
o

Преобразует целое число без знака в восьмеричное представление oooo .

  • Точность определяет минимальное количество отображаемых цифр. Точность по умолчанию равна 1 .
  • Если и преобразованное значение, и точность равны 0 , преобразование не выводит символов.
  • В альтернативной реализации точность увеличивается при необходимости для записи одного ведущего нуля. В этом случае, если и преобразованное значение, и точность равны 0 , записывается один 0 .
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
беззнаковая версия std::ptrdiff_t
N/A
x
X

Преобразует целое число без знака в шестнадцатеричное представление hhhh .

  • Для преобразования x используются буквы abcdef .
  • Для преобразования X используются буквы ABCDEF .
  • Точность определяет минимальное количество отображаемых цифр. Точность по умолчанию равна 1 .
  • Если и преобразованное значение, и точность равны 0 , преобразование не выдает символов.
  • В альтернативной реализации к результатам добавляется префикс 0x или 0X , если преобразованное значение ненулевое.
Н/Д
u

Преобразует беззнаковое целое число в десятичное представление dddd .

  • Точность определяет минимальное количество отображаемых цифр.
  • Точность по умолчанию равна 1 .
  • Если и преобразованное значение, и точность равны 0 , преобразование не выводит символов.
N/A
f
F (C++11)

Преобразует число с плавающей запятой в десятичную запись в формате [-]ddd.ddd .

  • Точность определяет точное количество цифр, отображаемых после десятичного разделителя.
  • Точность по умолчанию составляет 6 .
  • В альтернативной реализации десятичный разделитель записывается даже если после него не следует цифр.
  • Для преобразования бесконечности и не-числа смотрите примечания .
N/A N/A
double
double (C++11)
N/A N/A N/A N/A
long double
e
E

Преобразует число с плавающей запятой в экспоненциальную десятичную запись.

  • Для стиля преобразования e используется формат [-]d.ddd  e ±dd .
  • Для стиля преобразования E используется формат [-]d.ddd  E ±dd .
  • Экспонента содержит как минимум две цифры, дополнительные цифры используются только при необходимости.
  • Если значение равно 0 , экспонента также равна 0 .
  • Точность определяет точное количество цифр, отображаемых после десятичного разделителя.
  • Точность по умолчанию составляет 6 .
  • В альтернативной реализации десятичный разделитель записывается даже если после него не следует цифр.
  • Для преобразования бесконечности и не-числа смотрите примечания .
N/A N/A N/A N/A N/A N/A
a
A

(C++11)

Преобразует число с плавающей запятой в шестнадцатеричную экспоненциальную нотацию.

  • Для стиля преобразования a используется формат [-]  0x h.hhh  p ±d .
  • Для стиля преобразования A используется формат [-]  0X h.hhh  P ±d .
  • Первая шестнадцатеричная цифра не равна 0 , если аргумент является нормализованным числом с плавающей запятой.
  • Если значение равно 0 , экспонента также равна 0 .
  • Точность определяет точное количество цифр, которые должны отображаться после символа шестнадцатеричной точки.
  • Точность по умолчанию достаточна для точного представления значения.
  • В альтернативной реализации символ десятичной точки записывается, даже если после него не следует цифр.
  • Для преобразования бесконечности и не-числа смотрите примечания .
N/A N/A N/A N/A N/A N/A
g
G

Преобразует число с плавающей запятой в десятичную запись или запись с десятичным экспоненциальным представлением в зависимости от значения и точности .

  • Для стиля преобразования g будет выполнено преобразование со стилем e или f .
  • Для стиля преобразования G будет выполнено преобразование со стилем E или f (until C++11) F (since C++11) .
  • Пусть P равно точности, если она ненулевая, 6 если точность не указана, или 1 если точность равна 0 . Тогда, если преобразование со стилем E имело бы экспоненту X :
    • Если P > X ≥ −4 , преобразование выполняется со стилем f или F (since C++11) и точностью P − 1 − X .
    • В противном случае преобразование выполняется со стилем e или E и точностью P − 1 .
  • Если не запрошено альтернативное представление , конечные нули удаляются, также удаляется символ десятичной точки, если не осталось дробной части.
  • Для преобразования бесконечности и не-числа смотрите примечания .
N/A N/A N/A N/A N/A N/A
n

Возвращает количество символов, записанных на данный момент этим вызовом функции.

  • Результат записывается в значение, на которое указывает аргумент.
  • Спецификатор не может содержать никаких флагов , ширины поля или точности .
  • Для модификатора z ожидаемый тип аргумента - S * , где S - знаковая версия std:: size_t .
signed char *
short *
int *
long *
long long *
N/A
p

Выводит определяемую реализацией последовательность символов, определяющую указатель .

N/A N/A
void *
N/A N/A N/A N/A N/A N/A
Примечания

Функции преобразования чисел с плавающей запятой преобразуют бесконечность в inf или infinity . Какой именно вариант используется, определяется реализацией.

Не-число преобразуется в nan или nan( char_sequence ) . Какой именно вариант используется, определяется реализацией.

Преобразования F , E , G , A выводят INF , INFINITY , NAN вместо этого.

Спецификатор преобразования, используемый для вывода char , unsigned char , signed char , short и unsigned short , ожидает продвинутые типы стандартных продвижений аргументов , но перед выводом его значение будет преобразовано в char , unsigned char , signed char , short и unsigned short . Безопасно передавать значения этих типов из-за продвижения, которое происходит при вызове вариативной функции.

Правильные спецификаторы преобразования для типов символов фиксированной ширины ( std::int8_t и т.д.) определены в заголовочном файле <cinttypes> (хотя PRIdMAX , PRIuMAX и т.д. являются синонимами для %jd , %ju и т.д.).

Спецификатор преобразования с записью в память %n является частой целью атак на безопасность, когда строки формата зависят от пользовательского ввода.

Существует точка следования после действия каждого спецификатора преобразования; это позволяет сохранять несколько результатов %n в одной переменной или, как крайний случай, выводить строку, измененную предыдущим %n в том же вызове.

Если спецификация преобразования недействительна, поведение не определено.

Возвращаемое значение

1,2) Количество записанных широких символов в случае успеха или отрицательное значение в случае ошибки.
3) Количество записанных широких символов (без учёта завершающего нулевого широкого символа) в случае успеха, или отрицательное значение в случае ошибки кодировки или если количество генерируемых символов было равно или превышало size .

Примечания

В то время как узкие строки предоставляют std::vsnprintf , что позволяет определить необходимый размер выходного буфера, для широких строк эквивалента не существует, и для определения размера буфера программе может потребоваться вызвать std::vswprintf , проверить возвращаемое значение и перераспределить буфер большего размера, повторяя попытку до достижения успеха.

Пример

Смотрите также

выводит форматированные данные в stdout , файловый поток или буфер
используя список переменных аргументов
(функция)
выводит форматированные широкосимвольные данные в stdout , файловый поток или буфер
(функция)
Документация C для vwprintf , vfwprintf , vswprintf