Поделиться через


_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_lfwprintf_fwprintf_l
_printf_p, , _printf_p_l_wprintf_p_wprintf_p_l
printf, , _printf_lwprintf_wprintf_l
sprintf, , _sprintf_lswprintf, _swprintf_l__swprintf_l
scanf, , _scanf_lwscanf_wscanf_l
sscanf, , _sscanf_lswscanf_swscanf_l
sscanf_s, , _sscanf_s_lswscanf_s_swscanf_s_l
Функции vprintf
printf_p Позиционные параметры