Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Записывайте отформатированный вывод с помощью указателя на список аргументов, с возможностью указать порядок, в котором используются аргументы.
Синтаксис
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
Максимальное количество символов для хранения в версии этой функции в формате UNICODE.
format
Спецификация формата.
argptr
Указатель на список аргументов.
locale
Используемая региональная настройка.
Возвращаемое значение
_vsprintf_p и _vswprintf_p возвращает количество записанных символов, не включая завершающий NULL символ, или отрицательное значение, если возникает ошибка вывода.
Если указатель buffer и NULLsizeInBytes или count равны нулю, функции возвращают количество символов, которое было бы записано, не включая завершающий NULL.
Если значение buffer равно sizeInBytes и или count равно нулю, возвращается -1.
Замечания
Каждая из этих функций принимает указатель на список аргументов, а затем форматирует и записывает данные в память, на bufferкоторую указывает .
Эти функции отличаются от функции vsprintf_s и vswprintf_s только тем, что поддерживают позиционные параметры. Дополнительные сведения см. в разделе printf_p Позиционные параметры.
Версии этих функций с _l суффиксом идентичны, за исключением того, что они используют переданный параметр locale вместо текущей локали потока.
buffer Если параметры or 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_lfwprintf_fwprintf_l
printf, , _printf_lwprintf_wprintf_l
sprintf, _sprintf_l, , swprintf, _swprintf_l__swprintf_l
va_arg, , va_copyva_endva_start