vsprintf_s
, , _vsprintf_s_l
_vswprintf_s_l
vswprintf_s
_vstprintf_s
,_vstprintf_s_l
Записывают форматированные выходные данные с помощью указателя на список аргументов. Эти функции — это версии vsprintf
, _vsprintf_l
vswprintf
, _vswprintf_l
__vswprintf_l с улучшениями безопасности, как описано в функциях безопасности в CRT.
Дополнительные сведения _vstprintf_s
см_vstprintf_s_l
. в сопоставлениях функций универсального текста.
Синтаксис
int vsprintf_s(
char *buffer,
size_t numberOfElements,
const char *format,
va_list argptr
);
int _vsprintf_s_l(
char *buffer,
size_t numberOfElements,
const char *format,
_locale_t locale,
va_list argptr
);
int vswprintf_s(
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *format,
va_list argptr
);
int _vswprintf_s_l(
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *format,
_locale_t locale,
va_list argptr
);
template <size_t size>
int vsprintf_s(
char (&buffer)[size],
const char *format,
va_list argptr
); // C++ only
template <size_t size>
int vswprintf_s(
wchar_t (&buffer)[size],
const wchar_t *format,
va_list argptr
); // C++ only
Параметры
buffer
Место хранения выходных данных.
numberOfElements
Размер buffer
в символах.
format
Спецификация формата.
argptr
Указатель на список аргументов.
locale
Используемый языковой стандарт.
Возвращаемое значение
Функции vsprintf_s
и vswprintf_s
возвращают число записанных символов, не включая конечный нуль-символ, или отрицательное значение, если произошла ошибка вывода. Если или format
имеет значение NULL, если numberOfElements
равно нулю, или если buffer
строка форматирования содержит недопустимые символы форматирования, вызывается обработчик недопустимых параметров, как описано в разделе проверки параметров. Если продолжение выполнения разрешено, функции возвращают значение -1 и задают для errno
значение EINVAL
.
Дополнительные сведения об этих и других кодах ошибок см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
Замечания
Каждая из этих функций принимает указатель на список аргументов, а затем форматирует и записывает указанные данные в память, на которую указывает buffer
.
vswprintf_s
соответствует стандарту ISO C для vswprintf
, который требует указания второго параметра count
типа size_t
.
Эти функции отличаются от менее безопасных версий только тем, что они поддерживают позиционные параметры. Дополнительные сведения см. в разделе printf_p
"Позиционные параметры".
Версии этих функций с суффиксом _l
идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.
В C++использование этих функций упрощается перегрузками шаблонов. Перегрузки могут автоматически выводить длину буфера, устраняя необходимость указать аргумент размера. Кроме того, они могут автоматически заменить небезопасные функции своими безопасными коллегами. Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".
Внимание
Начиная с 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".
Сопоставления функций универсального текста
Функция в столбце сопоставляется с функцией в tchar.h
других столбцах в зависимости от набора символов, определенного во время компиляции.
Функция tchar.h |
_UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_vstprintf_s |
vsprintf_s |
vsprintf_s |
vswprintf_s |
_vstprintf_s_l |
_vsprintf_s_l |
_vsprintf_s_l |
_vswprintf_s_l |
Требования
Маршрут | Обязательный заголовок | Необязательные заголовки |
---|---|---|
vsprintf_s , _vsprintf_s_l |
<stdio.h> и <stdarg.h> . |
<varargs.h>* |
vswprintf_s , _vswprintf_s_l |
<stdio.h> или , и <wchar.h> <stdarg.h> |
<varargs.h>* |
* Требуется для совместимости UNIX V.
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_vsprintf_s.c
// Compile with: cl /W4 crt_vsprintf_s.c
// This program uses vsprintf_s 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 const * const format, ... )
{
va_list args;
int len;
char * buffer;
va_start( args, format );
len = _vscprintf( format, args ) // _vscprintf doesn't count
+ 1; // terminating '\0'
buffer = (char *) malloc( len * sizeof(char) );
if ( NULL != buffer )
{
vsprintf_s( buffer, len, format, args );
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