Namespaces
Variants

wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s

С сайта ru.cppreference.net
< c | io
 
 
Файловый ввод/вывод
Типы и объекты
        
Функции
Доступ к файлам
(C95)
Неформатированный ввод/вывод
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Форматированный ввод
Прямой ввод/вывод
Форматированный вывод
Позиционирование в файле
Обработка ошибок
Операции с файлами
 
Определено в заголовке <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)

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

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, лишние аргументы вычисляются и игнорируются.


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

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

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

Преобразование
Спецификатор
Пояснение Ожидаемый
Тип аргумента
Модификатор длины→ hh h нет l ll j z t L
Доступно только начиная с C99→ Да Да Да Да Да
% Записывает буквальный %. Полная спецификация преобразования должна быть %%. Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
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, преобразование не дает символов.
  • Для модификатора z ожидаемый тип аргумента — знаковая версия size_t.
signed char
short
int
long
long long
intmax_t
※
ptrdiff_t
Н/Д
b
B (необязательно)

(C23)

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

  • Точность задает минимальное количество выводимых цифр. Точность по умолчанию — 1.
  • Если и преобразованное значение, и точность равны 0, преобразование не дает символов.
  • В альтернативной реализации 0b или 0B добавляется префикс к результатам, если преобразованное значение не равно нулю.
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
беззнаковая версия ptrdiff_t
Н/Д
o

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

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

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

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

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

  • Точность задает минимальное количество выводимых цифр.
  • Точность по умолчанию — 1.
  • Если и преобразованное значение, и точность равны 0, преобразование не дает символов.
Н/Д
f
F (C99)

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

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

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

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

(C99)

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

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

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

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

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

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

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

Н/Д Н/Д
void*
Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
Примечания

Функции преобразования чисел с плавающей точкой преобразуют бесконечность в 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. Безопасно передавать значения этих типов из-за продвижения, которое происходит при вызове функции с переменным числом аргументов.

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

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

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

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

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

1,2) Количество записанных широких символов в случае успеха или отрицательное значение в случае ошибки.
3) Количество записанных широких символов (не считая завершающего нулевого широкого символа) в случае успеха или отрицательное значение в случае ошибки кодирования или если количество символов, подлежащих генерации, было равно или больше bufsz (в том числе когда bufsz равно нулю).
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ß水🍌'

Ссылки

  • Стандарт 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)

См. также

выводит форматированный вывод в stdout, файловый поток или буфер
(функция)
выводит форматированный широкий символьный вывод в stdout, файловый поток
или буфер, используя список аргументов переменной длины
(функция)
(C95)
записывает широкую строку в файловый поток
(функция)
Документация C++ для wprintf, fwprintf, swprintf