Spec-Zone.ru › C

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)

Загружает данные из заданных мест, преобразует их в эквиваленты широких строк и записывает результаты в различные потоки.

1) Записывает результаты в stdout.
2) Записывает результаты в потоке файла stream.
3) Если bufsz больше нуля, записывает результаты в широкую строку buffer. Максимально bufsz-1 широких символов записывается, за которыми следует нулевой широкий символ. Если bufsz равно нулю, ничего не записывается (и buffer может быть указателем на ноль).
4-6) То же, что (1-3), за исключением того, что следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений обработчика ограничений:
  • спецификатор преобразования %n присутствует в format
  • любой из аргументов, соответствующих %s является указателем на ноль
  • format или buffer является указателем на ноль
  • bufsz равно нулю или больше RSIZE_MAX/sizeof(wchar_t)
  • ошибки кодирования возникают в любом из спецификаторов преобразования строк и символов
  • (только для swprintf_s) количество широких символов, которые необходимо записать, включая нулевой, превысит bufsz.
7) То же, что (6), за исключением того, что результат будет усечён, чтобы поместиться в массив, на который указывает 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, лишние аргументы оцениваются и игнорируются.


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

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

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

Спецификатор
преобразования
Описание Ожидаемый
тип аргумента
Модификатор
длины
→
hh

(C99)

h (нет) l ll

(C99)

j

(C99)

z

(C99)

t

(C99)

L
% Выводит литерал %. Полная спецификация преобразования должна быть %%. Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
c Выводит один символ.

Аргумент сначала преобразуется в wchar_t так, как если бы был вызван btowc. Если используется модификатор l, то аргумент wint_t сначала преобразуется в wchar_t.

Н/Д Н/Д
int
wint_t
Н/Д Н/Д Н/Д Н/Д Н/Д
s Выводит строку символов.

Аргумент должен быть указателем на начальный элемент массива символов, содержащего последовательность многобайтовых символов, начинающуюся в начальном состоянии смены кодовой страницы, который преобразуется в массив широких символов, как если бы был вызван mbrtowc с инициализированным нулями состоянием преобразования. Точность определяет максимальное количество широких символов, которые будут выведены. Если точность не указана, выводятся все широкие символы до первого нулевого терминатора включительно. Если используется спецификатор l, то аргумент должен быть указателем на начальный элемент массива wchar_t.

Н/Д Н/Д
char*
wchar_t*
Н/Д Н/Д Н/Д Н/Д Н/Д
d
i
Преобразует целое число со знаком в десятичное представление [-]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
Н/Д
x
X
Преобразует целое число без знака в шестнадцатеричное представление hhhh.

Для x преобразования используются символы abcdef.
Для X преобразования используются символы ABCDEF.
Точность задаёт минимальное количество цифр. По умолчанию точность 1. Если преобразованное значение и точность ​0​, результат преобразования пуст. При альтернативной реализации 0x или 0X предваряют результат, если преобразованное значение не равно нулю.

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

Точность задаёт минимальное количество цифр. По умолчанию точность 1. Если преобразованное значение и точность ​0​, результат преобразования пуст.

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

Точность задаёт точное количество цифр после десятичной точки. По умолчанию точность 6. При альтернативной реализации десятичная точка выводится, даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания.

Н/Д Н/Д
double
double(C99)
Н/Д Н/Д Н/Д
long double
e
E
Преобразует число с плавающей точкой в десятичное экспоненциальное представление.

Для стиля e используется формат [-]d.ddde±dd.
Для стиля E используется формат [-]d.dddE±dd.
Экспонента содержит как минимум две цифры, больше цифр используются только при необходимости. Если значение ​0​, экспонента также ​0​. Точность задаёт точное количество цифр после десятичной точки. По умолчанию точность 6. При альтернативной реализации десятичная точка выводится, даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания.

Н/Д Н/Д Н/Д Н/Д
a
A

(C99)

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

Для стиля a используется формат [-]0xh.hhhp±d.
Для стиля A используется формат [-]0Xh.hhhP±d.
Первая шестнадцатеричная цифра не 0 если аргумент – нормализованное число с плавающей точкой. Если значение ​0​, экспонента также ​0​. Точность задаёт точное количество цифр после шестнадцатеричной точки. По умолчанию точность достаточна для точного представления значения. При альтернативной реализации десятичная точка выводится, даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания.

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

Для стиля g преобразование выполняется со стилем e или f.
Для стиля G преобразование выполняется со стилем E или F.
Пусть P равно точности, если она отлична от нуля, 6 если точность не указана, или 1 если точность ​0​. Тогда, если преобразование со стилем E имело бы экспоненту X,:

  • если P > X ≥ −4, преобразование выполняется со стилем f или F и точностью P − 1 − X.
  • в противном случае, преобразование выполняется со стилем e или E и точностью P − 1.

Если альтернативное представление не запрашивается, отбрасываются хвостовые нули, а также десятичная точка, если дробная часть отсутствует. Для бесконечности и нечисловых значений см. примечания.

Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
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, и т. д.) определены в заголовке <inttypes.h> (хотя PRIdMAX, PRIuMAX, и т. д. является синонимом %jd, %ju, и т. д.).

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

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

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

Значение результата

1,2) Количество записанных широких символов при успешном выполнении или отрицательное значение при ошибке.
3) Количество записанных широких символов (не считая завершающего нулевого широкого символа) при успешном выполнении или отрицательное значение при ошибке кодирования или если количество символов для генерации было равно или больше size (включая случай, когда size равно нулю).
4,5) Количество записанных широких символов при успешном выполнении или отрицательное значение при ошибке.
6) Количество широких символов (не считая завершающего нулевого) которые были записаны в buffer. Возвращает отрицательное значение при ошибках кодирования и переполнении. Возвращает ноль при всех остальных ошибках.
7) Количество широких символов (не считая завершающего нулевого), которые были бы записаны в 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)

См. также

printffprintfsprintfsnprintfprintf_sfprintf_ssprintf_ssnprintf_s
(C99)(C11)(C11)(C11)(C11)
печатает форматированный вывод в stdout, потоке файла или буфер
(функция)
vwprintfvfwprintfvswprintfvwprintf_svfwprintf_svswprintf_svsnwprintf_s
(C95)(C95)(C95)(C11)(C11)(C11)(C11)
печатает форматированный вывод широких символов в stdout, поток файла или буфер, используя список переменных аргументов
(функция)
fputws
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API