_sprintf_p
, , _sprintf_p_l
_swprintf_p
_swprintf_p_l
Запись форматированных данных в строку с возможностью указать порядок использования параметров в строке формата.
Синтаксис
int _sprintf_p(
char *buffer,
size_t sizeOfBuffer,
const char *format [,
argument_list]
);
int _sprintf_p_l(
char *buffer,
size_t sizeOfBuffer,
const char *format,
_locale_t locale [,
argument_list]
);
int _swprintf_p(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format [,
argument_list]
);
int _swprintf_p_l(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format,
_locale_t locale [,
argument_list]
);
Параметры
buffer
Место хранения выходных данных
sizeOfBuffer
Наибольшее число символов для хранения.
format
Строка управления форматом.
argument_list
Необязательные аргументы в строке форматирования.
locale
Используемый языковой стандарт.
Дополнительные сведения см. в разделе "Синтаксис спецификации формата".
Возвращаемое значение
Число записанных символов или -1, если произошла ошибка.
Замечания
Функция _sprintf_p
форматирует и сохраняет набор символов и значений в buffer
. Каждый аргумент в argument_list
(если есть) преобразуется и выводится в соответствии с соответствующей спецификацией формата.format
Аргумент format
использует синтаксис спецификации формата для printf
и wprintf
функций. После последнего написанного символа добавляется символ null. Если копирование производится между перекрывающимися строками, поведение не определено. Различие между функциями _sprintf_p
и sprintf_s
заключается в том, что функция _sprintf_p
поддерживает позиционные параметры, позволяющие определить порядок, в котором аргументы используются в строке форматирования. Дополнительные сведения см. в разделе printf_p
"Позиционные параметры".
_swprintf_p
— это двухбайтовая версия _sprintf_p
; аргументы указателя для _swprintf_p
представляют собой двухбайтовые строки. Обнаружение ошибок _swprintf_p
кодирования может отличаться от обнаружения _sprintf_p
. _swprintf_p
и fwprintf_p
ведут себя одинаково за тем исключением, что _swprintf_p
записывает выходные данные в строку, а не в назначение типа FILE
, а _swprintf_p
требует настройки параметра count
, определяющего максимальное количество символов для записи. Версии этих функций с суффиксом _l
идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.
_sprintf_p
возвращает число байтов, сохраненных в buffer
без учета завершающего символа null. _swprintf_p
возвращает число расширенных символов, сохраненных в buffer
, без учета завершающего расширенного символа null. Если или format
является пустым указателем, или если buffer
строка форматирования содержит недопустимые символы форматирования, вызывается обработчик недопустимых параметров, как описано в разделе проверки параметров. Если разрешается продолжать выполнение, эти функции возвращают -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 Определенные |
---|---|---|---|
_stprintf_p |
_sprintf_p |
_sprintf_p |
_swprintf_p |
_stprintf_p_l |
_sprintf_p_l |
_sprintf_p_l |
_swprintf_p_l |
Требования
Маршрут | Обязательный заголовок |
---|---|
_sprintf_p , _sprintf_p_l |
<stdio.h> |
_swprintf_p , _swprintf_p_l |
<stdio.h> или <wchar.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример. Использование _sprintf_p
для форматирования данных
// crt_sprintf_p.c
// This program uses _sprintf_p to format various
// data and place them in the string named buffer.
//
#include <stdio.h>
int main( void )
{
char buffer[200],
s[] = "computer", c = 'l';
int i = 35,
j;
float fp = 1.7320534f;
// Format and print various data:
j = _sprintf_p( buffer, 200,
" String: %s\n", s );
j += _sprintf_p( buffer + j, 200 - j,
" Character: %c\n", c );
j += _sprintf_p( buffer + j, 200 - j,
" Integer: %d\n", i );
j += _sprintf_p( buffer + j, 200 - j,
" Real: %f\n", fp );
printf( "Output:\n%s\ncharacter count = %d\n",
buffer, j );
}
Output:
String: computer
Character: l
Integer: 35
Real: 1.732053
character count = 79
Пример: обработка кода ошибки
// crt_swprintf_p.c
// This is the wide character example which
// also demonstrates _swprintf_p returning
// error code.
#include <stdio.h>
#define BUFFER_SIZE 100
int main( void )
{
wchar_t buffer[BUFFER_SIZE];
int len;
len = _swprintf_p(buffer, BUFFER_SIZE, L"%2$s %1$d",
0, L" marbles in your head.");
_printf_p( "Wrote %d characters\n", len );
// _swprintf_p fails because string contains WEOF (\xffff)
len = _swprintf_p(buffer, BUFFER_SIZE, L"%s",
L"Hello\xffff world" );
_printf_p( "Wrote %d characters\n", len );
}
Wrote 24 characters
Wrote -1 characters
См. также
Потоковый ввод-вывод
_fprintf_p
, , _fprintf_p_l
_fwprintf_p
_fwprintf_p_l
fprintf
, , _fprintf_l
fwprintf
_fwprintf_l
_printf_p
, , _printf_p_l
_wprintf_p
_wprintf_p_l
printf
, , _printf_l
wprintf
_wprintf_l
sprintf
, , _sprintf_l
swprintf
, _swprintf_l
__swprintf_l
scanf
, , _scanf_l
wscanf
_wscanf_l
sscanf
, , _sscanf_l
swscanf
_swscanf_l
sscanf_s
, , _sscanf_s_l
swscanf_s
_swscanf_s_l
Функции vprintf
printf_p
Позиционные параметры