Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Запись форматированных данных в строку. Доступны более безопасные версии некоторых из этих функций; см_swprintf_s_l. Безопасные версии swprintf и _swprintf_l размер буфера в качестве параметра.
Синтаксис
int sprintf(
char *buffer,
const char *format [,
argument] ...
);
int _sprintf_l(
char *buffer,
const char *format,
_locale_t locale [,
argument] ...
);
int swprintf(
wchar_t *buffer,
size_t count,
const wchar_t *format [,
argument]...
);
int _swprintf(
wchar_t *buffer,
const wchar_t *format [,
argument]...
);
int _swprintf_l(
wchar_t *buffer,
size_t count,
const wchar_t *format,
_locale_t locale [,
argument] ...
);
int __swprintf_l(
wchar_t *buffer,
const wchar_t *format,
_locale_t locale [,
argument] ...
);
template <size_t size>
int sprintf(
char (&buffer)[size],
const char *format [,
argument] ...
); // C++ only
template <size_t size>
int _sprintf_l(
char (&buffer)[size],
const char *format,
_locale_t locale [,
argument] ...
); // C++ only
Параметры
buffer
Место хранения выходных данных
count
Максимальное количество символов, которое может хранить эта функция в версии Юникод.
format
Строка управления форматом
argument
Необязательные аргументы
locale
Используемый языковой стандарт.
Дополнительные сведения см. в разделе "Синтаксис спецификации формата".
Возвращаемое значение
Число записанных символов или -1, если произошла ошибка. Если buffer или format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе проверки параметров. Если разрешается продолжать выполнение, эти функции возвращают -1 и задают errno значение EINVAL.
sprintf возвращает число байтов, сохраненных в bufferбез учета завершающего символа null.
swprintf возвращает число расширенных символов, сохраненных в buffer, без учета завершающего расширенного символа null.
Замечания
Функция sprintf форматирует и сохраняет набор символов и значений в buffer. Каждый argument (если он есть) преобразуется и выводится согласно соответствующей спецификацией формата в format. Формат состоит из обычных символов и имеет те же форму и функциональные возможности, что и аргумент format для printf. После последнего написанного символа добавляется символ null. Если копирование производится между перекрывающимися строками, поведение не определено.
Внимание
Функция sprintf не позволяет ограничить число записываемых символов, а значит, код, включающий функцию sprintf, может привести к переполнению буфера. Рекомендуется использовать связанную функцию snprintf, которая указывает максимальное количество символов для записи bufferили использование _scprintf для определения размера буфера. Кроме того, убедитесь, что format не является строкой, определяемой пользователем.
Начиная с 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ссылкой.
swprintf — это двухбайтовая версия sprintf; аргументы указателя для swprintf представляют собой двухбайтовые строки. Обнаружение ошибок swprintf кодирования может отличаться от sprintf.
swprintf и fwprintf ведет себя одинаково, кроме swprintf записи выходных данных в строку, а не в место назначения типа FILE, и swprintf требует count , чтобы параметр указал максимальное количество символов для записи. Версии этих функций с суффиксом _l идентичны, за исключением того, что они используют параметр языкового стандарта, переданный вместо текущего языкового стандарта потока.
До того, как подпись была swprintf стандартизирована, версия, отправленная в старой библиотеке среды выполнения Microsoft C, которая не принимает параметр счетчика символов. Более ранняя версия по-прежнему доступна в библиотеке среды выполнения Microsoft C, но она устарела и была переименована _swprintf(). Для кода, написанного в старой сигнатуре, определите _CRT_NON_CONFORMING_SWPRINTFS, с которым сопоставляется вызовы swprintf_swprintf. В будущей версии старое поведение может быть удалено, поэтому код необходимо изменить в соответствии с новым стандартным поведением.
В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые и безопасные аналоги этих функций. Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".
Сопоставления подпрограмм универсального текста
TCHAR.H рутина |
_UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
|---|---|---|---|
_stprintf |
sprintf |
sprintf |
_swprintf |
_stprintf_l |
_sprintf_l |
_sprintf_l |
__swprintf_l |
Требования
| Маршрут | Обязательный заголовок |
|---|---|
sprintf, _sprintf_l |
<stdio.h> |
swprintf, , _swprintf_swprintf_l |
<stdio.h> или <wchar.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример. Использование sprintf для форматирования данных
// crt_sprintf.c
// compile with: /W3
// This program uses sprintf 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( buffer, " String: %s\n", s ); // C4996
j += sprintf( buffer + j, " Character: %c\n", c ); // C4996
j += sprintf( buffer + j, " Integer: %d\n", i ); // C4996
j += sprintf( buffer + j, " Real: %f\n", fp );// C4996
// Note: sprintf is deprecated; consider using sprintf_s instead
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.c
// wide character example
// also demonstrates swprintf returning error code
#include <stdio.h>
int main( void )
{
wchar_t buf[100];
int len = swprintf( buf, 100, L"%s", L"Hello world" );
printf( "wrote %d characters\n", len );
len = swprintf( buf, 100, L"%s", L"Hello\xffff world" );
// swprintf fails because string contains WEOF (\xffff)
printf( "wrote %d characters\n", len );
}
wrote 11 characters
wrote -1 characters
См. также
Потоковый ввод-вывод
fprintf, , _fprintf_lfwprintf_fwprintf_l
printf, , _printf_lwprintf_wprintf_l
scanf, , _scanf_lwscanf_wscanf_l
sscanf, , _sscanf_lswscanf_swscanf_l
Функции vprintf