sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

Запись форматированных данных в строку. Доступны более безопасные версии некоторых из этих функций; см. раздел sprintf_s , _sprintf_s_lswprintf_s ,, _swprintf_s_l. Безопасные версии swprintf и _swprintf_l принимают размер буфера в качестве параметра.

Синтаксис

int sprintf(
   char *buffer,
   const char *format [,
   argument] ...
);
int _sprintf_l(
   char *buffer,
   const char *format,
   _locale_t locale [,
   argument] ...
);
int swprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format [,
   argument]...
);
int _swprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale [,
   argument] ...
);
int __swprintf_l(
   wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale [,
   argument] ...
);
template <size_t size>
int sprintf(
   char (&buffer)[size],
   const char *format [,
   argument] ...
); // C++ only
template <size_t size>
int _sprintf_l(
   char (&buffer)[size],
   const char *format,
   _locale_t locale [,
   argument] ...
); // C++ only

Параметры

buffer
Место хранения выходных данных

count
Максимальное количество символов, которое может хранить эта функция в версии Юникод.

format
Строка управления форматом

argument
Необязательные аргументы

locale
Используемый языковой стандарт.

Дополнительные сведения см. в разделе Спецификации формата.

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

Число записанных символов или-1, если произошла ошибка. Если параметр buffer или format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если разрешается продолжать выполнение, эти функции возвращают -1 и задают errno значение EINVAL.

sprintf возвращает число байтов, сохраненных в bufferбез учета завершающего символа null. swprintf возвращает число расширенных символов, сохраненных в buffer, без учета завершающего расширенного символа null.

Remarks

Функция sprintf форматирует и сохраняет набор символов и значений в buffer. Каждый argument (если он есть) преобразуется и выводится согласно соответствующей спецификацией формата в format. Формат состоит из обычных символов и имеет те же форму и функциональные возможности, что и аргумент format для printf. После последнего написанного символа добавляется символ null. Если копирование производится между перекрывающимися строками, поведение не определено.

Важно!

Функция sprintf не позволяет ограничить число записываемых символов, а значит, код, включающий функцию sprintf, может привести к переполнению буфера. Рассмотрите возможность использования функции _snprintf Related, определяющей максимальное число символов для записи buffer , или используйте _scprintf для определения размера требуемого буфера. Кроме того, убедитесь, что format не является строкой, определяемой пользователем.

начиная с версии Windows 10 2004 (сборка 19041), printf семейство функций выводит в соответствии с правилами IEEE 754 только значения с плавающей запятой. в предыдущих версиях Windows полностью непредставленные числа с плавающей запятой, которые заканчиваются на "5", всегда округляются. IEEE 754 указывает, что они должны округляться до ближайшей четной цифры (также называемой "округление банка"). Например, оба printf("%1.0f", 1.5) значения и printf("%1.0f", 2.5) должны округляться в 2. Ранее 1,5 бы округлялись до 2 и 2,5, округляя до 3. Это изменение влияет только на точное представление чисел. Например, 2,35 (который, когда представлен в памяти, находится ближе к 2.35000000000000008), по-своему округляется до 2,4. Округление, выполненное этими функциями, теперь также учитывает режим округления с плавающей запятой, fesetround установленный. Ранее округление всегда выбрало FE_TONEAREST поведение. это изменение влияет только на программы, созданные с использованием Visual Studio 2019 версии 16,2 и более поздних версий. Чтобы использовать устаревшее поведение округления с плавающей точкой, свяжите с "legacy_stdio_float_rounding. obj".

swprintf — это двухбайтовая версия sprintf; аргументы указателя для swprintf представляют собой двухбайтовые строки. Обнаружение ошибок кодирования в swprintf может отличаться от sprintf . swprintf и ведут себя одинаково, fwprintf за исключением того swprintf , что записывает выходные данные в строку, а не в назначение типа FILE , и swprintf требует параметр Count , чтобы указать максимальное число символов для записи. Версии этих функций с _l суффиксом идентичны, за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.

swprintf соответствует стандарту ISO C, который требует указания второго параметра (count) типа size_t. Чтобы применить нестандартное поведение принудительно, определите функцию _CRT_NON_CONFORMING_SWPRINTFS. В будущей версии старое поведение может быть удалено, поэтому код необходимо изменить в соответствии с новым стандартным поведением.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые и безопасные аналоги этих функций. Дополнительные сведения см. в разделе Безопасные перегрузки шаблонов.

Универсальное текстовое сопоставление функций

TCHAR.H ассемблер _UNICODE&_MBCS не определено _MBCS определяется _UNICODE определяется
_stprintf sprintf sprintf _swprintf
_stprintf_l _sprintf_l _sprintf_l __swprintf_l

Требования

Подпрограмма Обязательный заголовок
sprintf, _sprintf_l <stdio.h>
swprintf, _swprintf_l <stdio.h> либо <wchar.h>

Дополнительные сведения о совместимости см. в статье Compatibility.

Пример. Использование sprintf для форматирования данных

// crt_sprintf.c
// compile with: /W3
// This program uses sprintf to format various
// data and place them in the string named buffer.

#include <stdio.h>

int main( void )
{
   char  buffer[200], s[] = "computer", c = 'l';
   int   i = 35, j;
   float fp = 1.7320534f;

   // Format and print various data:
   j  = sprintf( buffer,     "   String:    %s\n", s ); // C4996
   j += sprintf( buffer + j, "   Character: %c\n", c ); // C4996
   j += sprintf( buffer + j, "   Integer:   %d\n", i ); // C4996
   j += sprintf( buffer + j, "   Real:      %f\n", fp );// C4996
   // Note: sprintf is deprecated; consider using sprintf_s instead

   printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
Output:
   String:    computer
   Character: l
   Integer:   35
   Real:      1.732053

character count = 79

Пример: обработка кода ошибки

// crt_swprintf.c
// wide character example
// also demonstrates swprintf returning error code
#include <stdio.h>

int main( void )
{
   wchar_t buf[100];
   int len = swprintf( buf, 100, L"%s", L"Hello world" );
   printf( "wrote %d characters\n", len );
   len = swprintf( buf, 100, L"%s", L"Hello\xffff world" );
   // swprintf fails because string contains WEOF (\xffff)
   printf( "wrote %d characters\n", len );
}
wrote 11 characters
wrote -1 characters

См. также:

Потоковый ввод-вывод
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l
scanf, _scanf_l, wscanf, _wscanf_l
sscanf, _sscanf_l, swscanf, _swscanf_l
vprintf Функции