std::wprintf, std::fwprintf, std::swprintf
Определено в заголовке <cwchar> | ||
|---|---|---|
int wprintf( const wchar_t* format, ... ); | (1) | |
int fwprintf( std::FILE* stream, const wchar_t* format, ... ); | (2) | |
int swprintf( wchar_t* buffer, std::size_t size, const wchar_t* format, ... ); | (3) |
Загружает данные из заданных местоположений, преобразует их в эквиваленты широких строк и записывает результаты в различные потоки.
stdout.stream.buffer. Максимум size - 1 широких символов записываются, после чего добавляется нулевой широкий символ.Параметры
| stream | - | выходной поток файла для записи |
| buffer | - | указатель на широкую строку символов для записи |
| size | - | может быть записано до size - 1 символов, плюс завершающий нулевой символ |
| format | - | указатель на завершаемую нулём широкую строку, определяющую, как интерпретировать данные |
| ... | - | аргументы, определяющие данные для вывода. Если любой аргумент после неявных преобразований не является типом, ожидаемым соответствующим спецификатором преобразования, или если аргументов меньше, чем требуется format, поведение не определено. Если аргументов больше, чем требуется format, лишние аргументы оцениваются и игнорируются |
Строка format состоит из обычных широких символов (кроме %), которые копируются без изменений в выходной поток, и спецификаторов преобразования. Каждая спецификация преобразования имеет следующий формат:
- вводный
%символ. - (необязательно) один или несколько флагов, которые изменяют поведение преобразования:
-
-: результат преобразования выравнивается слева внутри поля (по умолчанию выравнивание справа). -
+: знак для знакового преобразования всегда предшествует результату преобразования (по умолчанию результату предшествует минус только в случае отрицательного значения). - пробел: если результат знакового преобразования не начинается с символа знака или пустой, перед результатом добавляется пробел. Он игнорируется, если присутствует флаг
+. -
#: выполняется альтернативная форма преобразования. Точное влияние см. в таблице ниже, в противном случае поведение не определено. -
0: для целочисленных и чисел с плавающей точкой преобразования, ведущие нули используются для заполнения поля вместо пробелов. Для целых чисел он игнорируется, если точность указана явно. Для других преобразований использование этого флага приводит к неопределённому поведению. Он игнорируется, если присутствует флаг-. - (необязательно) целое значение или
*, которое указывает минимальную ширину поля. Результат дополняется пробелами (по умолчанию), если необходимо, слева при выравнивании справа или справа при выравнивании слева. В случае использования*, ширина задаётся дополнительным аргументом типаint, который предшествует аргументу, подлежащему преобразованию, и аргументу, задающему точность, если она указана. Если значение аргумента отрицательно, это приводит к указанию флага-и положительной ширине поля (Примечание: Это минимальная ширина: значение никогда не усекается.). - (необязательно)
., за которым следует целое число или*, или ни то, ни другое, что задаёт точность преобразования. В случае использования*, точность задаётся дополнительным аргументом типаint, который предшествует аргументу, подлежащему преобразованию, но следует за аргументом, задающим минимальную ширину поля, если он указан. Если значение этого аргумента отрицательно, оно игнорируется. Если ни число, ни*не используются, точность принимается равной нулю. Точное влияние точности см. в таблице ниже. - (необязательно) модификатор длины, который определяет размер аргумента (в сочетании со спецификатором формата преобразования он определяет тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Преобразование спецификатор | Описание | Ожидаемый тип аргумента |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
Модификатор длины→ |
hh (C++11) |
h | (нет) |
l |
ll (C++11) |
j (C++11) |
z (C++11) |
t (C++11) |
L |
|
% | Записывает литерал %. Полная спецификация преобразования должна быть %%. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c | Записывает один символ. Аргумент сначала преобразуется в | Н/Д | Н/Д |
int |
wint_t | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s | Записывает строку символов Аргумент должен быть указателем на начальный элемент массива символов, содержащего последовательность многобайтовых символов, начинающуюся в начальном состоянии сдвига, который преобразуется в массив широких символов, как если бы вызов | Н/Д | Н/Д |
char* |
wchar_t* | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
di | Преобразует целое число со знаком в десятичное представление [-]dddd. Точность указывает минимальное количество цифр для вывода. По умолчанию точность равна |
signed char |
short |
int |
long |
long long |
intmax_t |
целое со знаком size_t
|
ptrdiff_t | Н/Д |
o | Преобразует целое число без знака в восьмеричное представление oooo. Точность указывает минимальное количество цифр для вывода. По умолчанию точность равна |
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
беззнаковый аналог ptrdiff_t
| Н/Д |
xX | Преобразует целое число без знака в шестнадцатеричное представление hhhh. Для преобразования | Н/Д | ||||||||
u | Преобразует целое число без знака в десятичное представление dddd. Точность указывает минимальное количество цифр для вывода. По умолчанию точность равна | Н/Д | ||||||||
fF | Преобразует число с плавающей точкой в десятичную запись в стиле [-]ddd.ddd. Точность указывает точное число цифр после десятичной точки. По умолчанию точность равна | Н/Д | Н/Д |
double |
double(C++11)
| Н/Д | Н/Д | Н/Д | Н/Д |
long double |
eE | Преобразует число с плавающей точкой в десятичную запись с экспонентой. Для | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
aA (C++11) | Преобразует число с плавающей точкой в шестнадцатеричную запись с экспонентой. Для | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
gG | Преобразует число с плавающей точкой в десятичную или десятичную запись с экспонентой в зависимости от значения и точности. Для
Если не запрашивается альтернативное представление, хвостовые нули удаляются, а десятичная точка удаляется, если дробной части нет. Для бесконечности и неопределенного значения см. примечания. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
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 (включая случай, когда size равно нулю).Примечания
В то время как узкие строки обеспечивают std::snprintf, что позволяет определить необходимый размер буфера вывода, для широких строк эквивалента нет, и для определения размера буфера программа может потребовать вызвать std::swprintf, проверить значение результата и перевыделить больший буфер, повторяя попытку до тех пор, пока не добьётся успеха.
Пример
#include <clocale>
#include <cwchar>
#include <iostream>
#include <locale>
int main()
{
char narrow_str[] = "z\u00df\u6c34\U0001f34c";
// or "zß水🍌";
// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c";
wchar_t warr[29]; // the expected string is 28 characters plus 1 null terminator
std::setlocale(LC_ALL, "en_US.utf8");
std::swprintf(warr, sizeof warr/sizeof *warr,
L"Converted from UTF-8: '%s'", narrow_str);
std::wcout.imbue(std::locale("en_US.utf8"));
std::wcout << warr << '\n';
}Вывод:
Converted from UTF-8: 'zß水🍌'
См. также
|
(C++11) | выводит форматированный вывод в stdout, поток файла или буфер (функция) |
выводит форматированный вывод широких символов в stdout, поток файла или буфер, используя список переменных аргументов (функция) |
|
| записывает широкую строку в поток файла (функция) |
|
C документация для wprintf, fwprintf, swprintf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/c/fwprintf