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
См. также
Ссылки
Синтаксис описания формата: функции printf и wprintf
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l