vsprintf
, , _vsprintf_l
vswprintf
, _vswprintf_l
__vswprintf_l
Записывают форматированные выходные данные с помощью указателя на список аргументов. Доступны более безопасные версии этих функций; см. , vswprintf_s
_vsprintf_s_l
, _vswprintf_s_l
.vsprintf_s
Синтаксис
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
.
Дополнительные сведения об этих и других кодах ошибок см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
Замечания
Каждая из этих функций принимает указатель на список аргументов, а затем форматирует и записывает указанные данные в память, на которую указывает buffer
.
Версии этих функций с суффиксом _l
идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.
Внимание
Использование 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_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