wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s
| Определено в заголовке <wchar.h>
|
||
int wprintf( const wchar_t* format, ... );
|
(1) | (начиная с C95) (до C99) |
int wprintf( const wchar_t* restrict format, ... );
|
(начиная с C99) | |
int fwprintf( FILE* stream, const wchar_t* format, ... );
|
(2) | (начиная с C95) (до C99) |
int fwprintf( FILE* restrict stream,
const wchar_t* restrict format, ... );
|
(начиная с C99) | |
int swprintf( wchar_t* buffer, size_t bufsz,
const wchar_t* format, ... );
|
(3) | (начиная с 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) |
Загружает данные из заданных местоположений, преобразует их в широкие строковые эквиваленты и записывает результаты в различные приемники.
stream.bufsz больше нуля, записывает результаты в широкую строку buffer. Записывается не более bufsz - 1 широких символов, после чего следует завершающий нулевой широкий символ. Если bufsz равно нулю, ничего не записывается (и buffer может быть нулевым указателем).- спецификатор преобразования
%nприсутствует вformat - любой из аргументов, соответствующий
%s, является нулевым указателем formatилиbufferявляется нулевым указателемbufszравно нулю или большеRSIZE_MAX / sizeof(wchar_t)- возникают ошибки кодирования в спецификаторах строковых и символьных преобразований
- (только для
swprintf_s) количество широких символов, подлежащих записи, включая нулевой, превыситbufsz.
s.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, лишние аргументы вычисляются и игнорируются.
|
Строка format состоит из обычных широких символов (кроме %), которые копируются без изменений в выходной поток, и спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
- вводный символ
%.
- вводный символ
- (необязательно) один или несколько флагов, изменяющих поведение преобразования:
-: результат преобразования выравнивается влево в поле (по умолчанию выравнивается вправо).+: знак знаковых преобразований всегда добавляется к результату преобразования (по умолчанию перед результатом ставится минус только в том случае, если он отрицательный).- пробел: если результат знакового преобразования не начинается со знакового символа или пуст, перед результатом ставится пробел. Игнорируется, если присутствует флаг
+. #: выполняется альтернативная форма преобразования. Подробные эффекты см. в таблице ниже, иначе поведение не определено.0: для целочисленных преобразований и преобразований чисел с плавающей точкой ведущие нули используются для заполнения поля вместо символов пробел. Для целых чисел игнорируется, если точность указана явно. Для других преобразований использование этого флага приводит к неопределенному поведению. Игнорируется, если присутствует флаг-.
- (необязательно) целочисленное значение или
*, задающее минимальную ширину поля. При необходимости результат дополняется символами пробел (по умолчанию) слева при выравнивании вправо или справа при выравнивании влево. В случае использования*ширина задается дополнительным аргументом типаint, который появляется перед преобразуемым аргументом и аргументом, задающим точность, если таковой предоставлен. Если значение аргумента отрицательно, это приводит к указанию флага-и положительной ширины поля (Примечание: это минимальная ширина: значение никогда не усекается).
- (необязательно) целочисленное значение или
- (необязательно)
.после которого следует целое число или*, или ничего, что задает точность преобразования. В случае использования*точность задается дополнительным аргументом типаint, который появляется перед преобразуемым аргументом, но после аргумента, задающего минимальную ширину поля, если таковой предоставлен. Если значение этого аргумента отрицательно, оно игнорируется. Если не используется ни число, ни*, точность принимается равной нулю. Подробные эффекты точности см. в таблице ниже.
- (необязательно)
- (необязательно) модификатор длины, который определяет размер аргумента (в комбинации со спецификатором формата преобразования он определяет тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Преобразование Спецификатор |
Пояснение | Ожидаемый Тип аргумента | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ | hh | h | нет | 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 (в том числе когда bufsz равно нулю).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ß水🍌'
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.29.2.1 Функция fwprintf (стр.: TBD)
- 7.29.2.3 Функция swprintf (стр.: TBD)
- 7.29.2.11 Функция wprintf (стр.: TBD)
- K.3.9.1.1 Функция fwprintf_s (стр.: TBD)
- K.3.9.1.4 Функция swprintf_s (стр.: TBD)
- K.3.9.1.13 Функция wprintf_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.29.2.1 Функция fwprintf (стр.: TBD)
- 7.29.2.3 Функция swprintf (стр.: TBD)
- 7.29.2.11 Функция wprintf (стр.: TBD)
- K.3.9.1.1 Функция fwprintf_s (стр.: TBD)
- K.3.9.1.4 Функция swprintf_s (стр.: TBD)
- K.3.9.1.13 Функция wprintf_s (стр.: TBD)
- Стандарт 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
| |