_vsprintf_p
, , _vsprintf_p_l
_vswprintf_p
_vswprintf_p_l
Записывают форматированные выходные данные, используя указатель на список аргументов, с возможностью указать порядок, в котором эти аргументы используются.
Синтаксис
int _vsprintf_p(
char *buffer,
size_t sizeInBytes,
const char *format,
va_list argptr
);
int _vsprintf_p_l(
char *buffer,
size_t sizeInBytes,
const char *format,
_locale_t locale,
va_list argptr
);
int _vswprintf_p(
wchar_t *buffer,
size_t count,
const wchar_t *format,
va_list argptr
);
int _vswprintf_p_l(
wchar_t *buffer,
size_t count,
const wchar_t *format,
_locale_t locale,
va_list argptr
);
Параметры
buffer
Место хранения выходных данных.
sizeInBytes
Размер buffer
в символах.
count
Максимальное количество символов, которое может хранить эта функция в версии Юникод.
format
Спецификация формата.
argptr
Указатель на список аргументов.
locale
Используемый языковой стандарт.
Возвращаемое значение
Функции _vsprintf_p
и _vswprintf_p
возвращают число записанных символов, не включая конечный нуль-символ, или отрицательное значение, если произошла ошибка вывода.
Замечания
Каждая из этих функций принимает указатель на список аргументов, а затем форматирует и записывает указанные данные в память, на которую указывает buffer
.
Эти функции отличаются от функций vsprintf_s
и vswprintf_s
только в том, что они поддерживают позиционные параметры. Дополнительные сведения см. в разделе Позиционные параметры printf_p.
Версии этих функций с суффиксом _l
идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.
buffer
Если указатели или format
параметры являются NULL
указателями, если число равно нулю или если строка форматирования содержит недопустимые символы форматирования, вызывается обработчик недопустимых параметров, как описано в разделе "Проверка параметров". Если продолжение выполнения разрешено, функции возвращают значение -1 и задают для errno
значение EINVAL
.
Внимание
Начиная с 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 | _UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_vstprintf_p |
_vsprintf_p |
_vsprintf_p |
_vswprintf_p |
_vstprintf_p_l |
_vsprintf_p_l |
_vsprintf_p_l |
_vswprintf_p_l |
Требования
Маршрут | Обязательный заголовок | Необязательные заголовки |
---|---|---|
_vsprintf_p , _vsprintf_p_l |
<stdio.h> и <stdarg.h> | <varargs.h>* |
_vswprintf_p , _vswprintf_p_l |
<stdio.h> или <wchar.h и <stdarg.h>> | <varargs.h>* |
* Требуется для совместимости UNIX V.
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt__vsprintf_p.c
// This program uses vsprintf_p to write to a buffer.
// The size of the buffer is determined by _vscprintf_p.
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void example( char * format, ... )
{
va_list args;
int len;
char *buffer = NULL;
va_start( args, format );
// _vscprintf doesn't count the
// null terminating string so we add 1.
len = _vscprintf_p( format, args ) + 1;
// Allocate memory for our buffer
buffer = (char*)malloc( len * sizeof(char) );
if (buffer)
{
_vsprintf_p( buffer, len, format, args );
puts( buffer );
free( buffer );
}
va_end( args );
}
int main( void )
{
// First example
example( "%2$d %1$c %3$d", '<', 123, 456 );
// Second example
example( "%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