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


vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l

Записывают форматированные выходные данные с помощью указателя на список аргументов. Существуют более безопасные версии этих функций; см. раздел vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_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
    Максимальное число символов для хранения, в версии UNICODE для этой функции.

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

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

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

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

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

Дополнительные сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.

Заметки

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

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

Примечание о безопасностиПримечание по безопасности

Не существует способа ограничения количества записанные символов с помощью vsprintf, что означает, что код, использующий эту функцию, восприимчив к переполнениям буфера.Вместо этой функции следует использовать _vsnprintf или вызывать _vscprintf, чтобы определить, насколько больший буфер нужен.Также убедитесь, что format не является строкой, определяемой пользователем.Дополнительные сведения см. в разделе Как избежать переполнения буфера.

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: /W3
// This program uses vsprintf to write to a buffer.
// The size of the buffer is determined by _vscprintf.

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

void test( char * 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) );

    vsprintf( buffer, format, args ); // C4996
    // Note: vsprintf is deprecated; consider using vsprintf_s instead
    puts( buffer );

    free( buffer );
}

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

Эквивалент в .NET Framework

System::String::Format

См. также

Ссылки

Потоковый ввод-вывод

Функции vprintf

Синтаксис описания формата: функции printf и wprintf

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start