Поделиться через


vsprintf, , _vsprintf_lvswprintf, _vswprintf_l__vswprintf_l

Запишите отформатированный вывод с помощью указателя на список аргументов. Доступны более безопасные версии этих функций; смvsprintf_s._vsprintf_s_l

Синтаксис

int vsprintf(
   char *buffer,
   const char *format,
   va_list argptr
);
int _vsprintf_l(
   char *buffer,
   const char *format,
   _locale_t locale,
   va_list argptr
);
int vswprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   va_list argptr
);
int _vswprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
int __vswprintf_l(
   wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
template <size_t size>
int vsprintf(
   char (&buffer)[size],
   const char *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vsprintf_l(
   char (&buffer)[size],
   const char *format,
   _locale_t locale,
   va_list argptr
); // C++ only
template <size_t size>
int vswprintf(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vswprintf_l(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
); // C++ only

Параметры

buffer
Место хранения продукции.

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

format
Спецификация формата.

argptr
Указатель на список аргументов.

locale
Используемая региональная настройка.

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

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

If bufferNULL указатель и count равен нулю, и vswprintf возвращает количество символов, которое было бы записано, _vswprintf_l не включая завершающий NULL.

If buffer справедливо и count равно нулю, vswprintf и _vswprintf_l возвращает -1. Содержимое buffer не изменилось.

Для получения информации об этих и других кодах ошибок см. ,errno_doserrno , _sys_errlist, и _sys_nerr.

Замечания

Каждая из этих функций принимает указатель на список аргументов, а затем форматирует и записывает данные в память, на bufferкоторую указывает .

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

Это важно

При использовании vsprintf, нет возможности ограничить количество записываемых символов, а это означает, что код, использующий эту функцию, подвержен переполнению буфера. Используйте _vsnprintf вместо этого или вызовите _vscprintf , чтобы определить, насколько велик буфер. Кроме того, убедитесь, что это 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,3500000000000000008) продолжает округляется до 2,4. Округление, выполняемое этими функциями, теперь также учитывает режим округления с плавающей запятой, заданный fesetround. Ранее округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее поведение округления с плавающей запятой, свяжите со legacy_stdio_float_rounding.objссылкой.

vswprintf соответствует стандарту ISO C, который требует второго параметра, count, типа size_t. Чтобы принудительно применить старое нестандартное поведение, определите _CRT_NON_CONFORMING_SWPRINTFS. Старое поведение может отсутствовать в будущей версии, поэтому код следует изменить для использования нового соответствующего поведения.

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

Сопоставления подпрограмм универсального текста

TCHAR.H рутина _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_l _vsprintf_l _vsprintf_l _vswprintf_l

Требования

Рутина Обязательный заголовок Необязательные заголовки
vsprintf, _vsprintf_l <stdio.h> и <stdarg.h>. <varargs.h>*
vswprintf, _vswprintf_l <stdio.h> или , <wchar.h>и <stdarg.h> <varargs.h>*

* Требуется для совместимости с UNIX V.

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

Пример

// crt_vsprintf.c
// compile with: cl /W4 crt_vsprintf.c
// This program uses vsprintf to write to a buffer.
// The size of the buffer is determined by _vscprintf.

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

void test( char const * const format, ... )
{
    va_list args;
    int     len;
    char    *buffer;

    // retrieve the variable arguments
    va_start( args, format );

    len = _vscprintf( format, args ) // _vscprintf doesn't count
                                + 1; // terminating '\0'

    buffer = (char*)malloc( len * sizeof(char) );
    if ( 0 != buffer )
    {
        vsprintf( buffer, format, args ); // C4996
        // Note: vsprintf is deprecated; consider using vsprintf_s instead
        puts( buffer );

        free( buffer );
    }
    va_end( args );
}

int main( void )
{
   test( "%d %c %d", 123, '<', 456 );
   test( "%s", "This is a string" );
}
123 < 456
This is a string

См. также

Потоковый ввод-вывод
vprintf функции
Синтаксис спецификации формата: printf и wprintf функции
fprintf, , _fprintf_lfwprintf_fwprintf_l
printf, , _printf_lwprintf_wprintf_l
sprintf, _sprintf_l, , swprintf, _swprintf_l__swprintf_l
va_arg, , va_copyva_endva_start