wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s
Defined in header <wchar.h> | ||
|---|---|---|
| (1) | ||
int wprintf( const wchar_t *format, ... ); | (с C95) (до C99) | |
int wprintf( const wchar_t *restrict format, ... ); | (с C99) | |
| (2) | ||
int fwprintf( FILE *stream, const wchar_t *format, ... ); | (с C95) (до C99) | |
int fwprintf( FILE *restrict stream,
const wchar_t *restrict format, ... );
| (с C99) | |
| (3) | ||
int swprintf( wchar_t *buffer, size_t bufsz,
const wchar_t *format, ... );
| (с C95) (до C99) | |
int swprintf( wchar_t *restrict buffer, size_t bufsz,
const wchar_t *restrict format, ... );
| (с C99) | |
int wprintf_s( const wchar_t *restrict format, ... ); | (4) | (с C11) |
int fwprintf_s( FILE *restrict stream,
const wchar_t *restrict format, ... );
| (5) | (с C11) |
int swprintf_s( wchar_t *restrict buffer, rsize_t bufsz,
const wchar_t *restrict format, ... );
| (6) | (с C11) |
int snwprintf_s( wchar_t *restrict s, rsize_t n,
const wchar_t *restrict format, ... );
| (7) | (с C11) |
Загружает данные из заданных мест, преобразует их в эквиваленты широких строк и записывает результаты в различные потоки.
stdout.stream.bufsz больше нуля, записывает результаты в широкую строку buffer. Максимально bufsz-1 широких символов записывается, за которыми следует нулевой широкий символ. Если bufsz равно нулю, ничего не записывается (и buffer может быть указателем на ноль).- спецификатор преобразования
%nприсутствует вformat - любой из аргументов, соответствующих
%sявляется указателем на ноль -
formatилиbufferявляется указателем на ноль -
bufszравно нулю или большеRSIZE_MAX/sizeof(wchar_t) - ошибки кодирования возникают в любом из спецификаторов преобразования строк и символов
- (только для
swprintf_s) количество широких символов, которые необходимо записать, включая нулевой, превыситbufsz.
wprintf_s , fwprintf_s, swprintf_s, и snwprintf_s гарантированы только в том случае, если __STDC_LIB_EXT1__ определён реализацией и если пользователь определит __STDC_WANT_LIB_EXT1__ в целочисленной константе 1 до включения <stdio.h>.Параметры
| stream | - | поток вывода файла для записи |
| buffer | - | указатель на широкую строку символов для записи |
| bufsz | - | может быть записано до bufsz-1 широких символов плюс нулевой терминатор |
| format | - | указатель на завершающуюся нулём широкую строку, определяющую способ интерпретации данных |
| ... | - | аргументы, определяющие данные для вывода. Если какой-либо аргумент после преобразования стандартных аргументов не является типом, ожидаемым соответствующим спецификатором преобразования, или если аргументов меньше, чем требуется format, поведение не определено. Если аргументов больше, чем требуется format, лишние аргументы оцениваются и игнорируются. |
Строка формата состоит из обычных широких символов (кроме %), которые копируются без изменений в поток вывода, и спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
- вводный
%символ. - (необязательно) один или несколько флагов, которые изменяют поведение преобразования:
-
-: результат преобразования выравнивается по левому краю в поле (по умолчанию он выравнивается по правому краю). -
+: знак знакового преобразования всегда предшествует результату преобразования (по умолчанию результат предваряется знаком минус только в случае отрицательного значения). - пробел: если результат знакового преобразования не начинается с символа знака или пуст, перед результатом добавляется пробел. Он игнорируется, если присутствует флаг
+. -
#: выполняется альтернативная форма преобразования. См. таблицу ниже для точного воздействия, в противном случае поведение не определено. -
0: для преобразований целых и чисел с плавающей запятой, ведущие нули используются для заполнения поля вместо символов пробела. Для целых чисел он игнорируется, если точность указана явно. Для других преобразований использование этого флага приводит к неопределённому поведению. Он игнорируется, если присутствует флаг-. - (необязательно) целое значение или
*, которые задают минимальную ширину поля. Результат дополняется символами пробела (по умолчанию), если это необходимо, слева при выравнивании по правому краю или справа при выравнивании по левому краю. В случае использования*ширина задаётся дополнительным аргументом типаint, который появляется перед аргументом для преобразования и аргументом, предоставляющим точность, если она указана. Если значение аргумента отрицательно, это приводит к указанию флага-и положительной ширине поля (Примечание: Это минимальная ширина: значение никогда не усекается.). - (необязательно)
., за которым следует целое число или*, или ни того, ни другого, что задаёт точность преобразования. В случае использования*точность задаётся дополнительным аргументом типаint, который появляется перед аргументом для преобразования, но после аргумента, задающего минимальную ширину поля, если она указана. Если значение этого аргумента отрицательно, оно игнорируется. Если ни число, ни*не используются, точность принимается равной нулю. См. таблицу ниже для точного воздействия точности. - (необязательно) модификатор длины, который задаёт размер аргумента (в сочетании со спецификатором формата преобразования, он задаёт тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования | Описание | Ожидаемый тип аргумента |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
Модификатор длины→ |
hh (C99) |
h | (нет) |
l |
ll (C99) |
j (C99) |
z (C99) |
t (C99) |
L |
|
% | Выводит литерал %. Полная спецификация преобразования должна быть %%. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c | Выводит один символ. Аргумент сначала преобразуется в | Н/Д | Н/Д |
int |
wint_t | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s | Выводит строку символов. Аргумент должен быть указателем на начальный элемент массива символов, содержащего последовательность многобайтовых символов, начинающуюся в начальном состоянии смены кодовой страницы, который преобразуется в массив широких символов, как если бы был вызван | Н/Д | Н/Д |
char* |
wchar_t* | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
di | Преобразует целое число со знаком в десятичное представление [-]dddd. Точность задаёт минимальное количество цифр. По умолчанию точность |
signed char |
short |
int |
long |
long long |
целое число со знаком size_t
| Н/Д | ||
o | Преобразует целое число без знака в восьмеричное представление oooo. Точность задаёт минимальное количество цифр. По умолчанию точность |
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
беззнаковое представление ptrdiff_t
| Н/Д | ||
xX | Преобразует целое число без знака в шестнадцатеричное представление hhhh. Для | Н/Д | ||||||||
u | Преобразует целое число без знака в десятичное представление dddd. Точность задаёт минимальное количество цифр. По умолчанию точность | Н/Д | ||||||||
fF | Преобразует число с плавающей точкой в десятичное представление в формате [-]ddd.ddd. Точность задаёт точное количество цифр после десятичной точки. По умолчанию точность | Н/Д | Н/Д |
double |
double(C99)
| Н/Д | Н/Д | Н/Д |
long double |
|
eE | Преобразует число с плавающей точкой в десятичное экспоненциальное представление. Для стиля | Н/Д | Н/Д | Н/Д | Н/Д | |||||
aA (C99) | Преобразует число с плавающей точкой в шестнадцатеричное экспоненциальное представление. Для стиля | Н/Д | Н/Д | Н/Д | Н/Д | |||||
gG | Преобразует число с плавающей точкой в десятичное или десятичное экспоненциальное представление в зависимости от значения и точности. Для стиля
Если альтернативное представление не запрашивается, отбрасываются хвостовые нули, а также десятичная точка, если дробная часть отсутствует. Для бесконечности и нечисловых значений см. примечания. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
n | Возвращает количество символов, записанных до сих пор этим вызовом функции. Результат записывается в значение, на которое указывает аргумент. Спецификация может не содержать ни флаги, ни ширину поля, ни точность. |
signed char* |
short* |
int* |
long* |
long long* |
знаковый size_t*
| Н/Д | ||
|---|---|---|---|---|---|---|---|---|---|---|
p | Записывает определяемую реализацией последовательность символов, определяющую указатель. | Н/Д | Н/Д |
void* | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
Функции преобразования с плавающей точкой преобразуют бесконечность в inf или infinity. Какой вариант используется, определяется реализацией.
Не-число преобразуется в nan или nan(char_sequence). Какой вариант используется, определяется реализацией.
Преобразования F, E, G, A выдают INF, INFINITY, NAN соответственно.
Несмотря на то, что %c ожидает аргумент int, безопасно передавать char, благодаря целочисленному продвижению, которое происходит при вызове функции с переменным числом аргументов.
Правильные спецификации преобразования для типов символов фиксированной ширины (int8_t, и т. д.) определены в заголовке <inttypes.h> (хотя PRIdMAX, PRIuMAX, и т. д. является синонимом %jd, %ju, и т. д.).
Спецификатор преобразования для записи в память %n является распространённой целью эксплойтов, где строки формата зависят от пользовательского ввода, и не поддерживается семейством функций printf_s с проверкой границ.
После действия каждого спецификатора преобразования имеется точка последовательности; это позволяет сохранять несколько результатов %n в одной переменной или, в качестве крайнего случая, выводить строку, изменённую предыдущим %n в том же вызове.
Если спецификация преобразования некорректна, поведение не определено.
Значение результата
size (включая случай, когда size равно нулю).buffer. Возвращает отрицательное значение при ошибках кодирования и переполнении. Возвращает ноль при всех остальных ошибках.buffer если бы bufsz было достаточно большим, или отрицательное значение в случае возникновения ошибки. (то есть запись была успешна и завершена только если возвращаемое значение неотрицательно и меньше bufsz)Примечания
Хотя узкие строки предоставляют snprintf, что позволяет определить необходимый размер буфера вывода, для широких строк нет эквивалента (до snwprintf_s)(с C11), и для определения размера буфера программе может потребоваться вызвать swprintf, проверить значение результата и перевыделить больший буфер, пытаясь снова до тех пор, пока не будет успеха.
snwprintf_s, в отличие от swprintf_s, будет усекать результат для соответствия массиву, на который указывает buffer, даже если усечение обрабатывается как ошибка большинством функций с проверкой границ.
Пример
#include <locale.h>
#include <wchar.h>
int main(void)
{
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
setlocale(LC_ALL, "en_US.utf8");
swprintf(warr, sizeof warr/sizeof *warr,
L"Converted from UTF-8: '%s'", narrow_str);
wprintf(L"%ls\n", warr);
}Вывод:
Converted from UTF-8: 'zß水🍌'
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.29.2.1 Функция fwprintf (с. 403-410)
- 7.29.2.3 Функция swprintf (с. 416)
- 7.29.2.11 Функция wprintf (с. 421)
- K.3.9.1.1 Функция fwprintf_s (с. 628)
- K.3.9.1.4 Функция swprintf_s (с. 630-631)
- K.3.9.1.13 Функция wprintf_s (с. 637-638)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.24.2.1 Функция fwprintf (с. 349-356)
- 7.24.2.3 Функция swprintf (с. 362)
- 7.24.2.11 Функция wprintf (с. 366)
См. также
|
(C99)(C11)(C11)(C11)(C11) | печатает форматированный вывод в stdout, потоке файла или буфер (функция) |
|
(C95)(C95)(C95)(C11)(C11)(C11)(C11) | печатает форматированный вывод широких символов в stdout, поток файла или буфер, используя список переменных аргументов (функция) |
|
(C95) | записывает широкую строку в поток файла (функция) |
Документация C++ для wprintf, fwprintf, swprintf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/io/fwprintf