Функции производят форматированный вывод в символьную строку (функция библиотеки С и С++).
int sprintf( char *string, const char *format [, argument] ... );wint_t swprintf( wchar_t *string size_t count, const wchar_t *format, ... ); |
string
Указатель на строку, в которую осуществляется вывод.
count
Максимальное число символов, которое сохраняется в версии Unicode этой функции.
formatУправление форматом.
argument ...Переменное число параметров (дополнительные параметры).
В случае ошибки возвращается EOF (WEOF)
Функция возвращает число записанных символов или – (минус)1, если произошла ошибка. Если string или format - пустой указатель, вызывается обработчик недопустимых параметров, как описано в статье Проверка достоверности параметров. Если разрешено исполнение кода, чтобы продолжить, эти функции возвращают значение -(минус)1 и устанавливают errno в EINVAL.
Функция sprintf возвращает число байтов, сохраненное в буфере, не считая символ завершающего нуля. Функция swprintf возвращает число "широких " символов, сохраненных в буфере, не считая "широкого " завершающегося нулевого символа.
Функция sprintf форматирует и охраняет ряд символов и значений в буфере. Каждый параметр (если он есть) преобразуется и выводится согласно соответствующей спецификации формата. Формат состоит из обычных символов и имеет ту же самую форму и действие, как и параметры формата для функции printf. Нулевой символ добавлен в конец после последнего письменного символа. Если копирование происходит между строками, которые накладываются друг на друга, поведение функции не определяется.
Функция sprintf форматирует и записывает ряд символов и значений в массиве вывода данных, на который ссылается параметр string. Если параметры следуют за строкой format, то форматирующая (format) строка должна содержать спецификации, которые определяют формат вывода для параметров. Функции sprintf и printf ведут себя тождественно за исключением того, что printf печатает выводимые данные в stdout, а не в массив выводимых данных (строку).
Функция swprintf - широкосимвольная версия sprintf (для Unicode); format - широкосимвольная строка. Функции swprintf и sprintf во всем остальном ведут себя тождественно.
Параметр format состоит из обычных символов, последовательностей escape, и (если параметры следуют за параметром format) спецификаций формата. Обычные символы и последовательности escape копируются в строке в порядке их поступления. Например, строка
sprintf("Line one\n\t\tLine two\n"); |
создает вывод
Line one Line two |
Спецификации формата всегда начинаются со знака процента (%) и читается слева направо. Когда функция sprintf встречается с первой спецификацией формата (если она есть), то преобразует значение первого параметра после format и выводит его соответственно. Вторая спецификация формата заставляет второй параметр быть преобразованным и выведенным и так далее. Если имеется больше параметров, чем есть их спецификаций, дополнительные параметры игнорируются. Результаты не определяются, если недостаточно параметров для всех спецификаций формата.
Замечание по обеспечению безопасности! Убедитесь в том, что формат не определяемая пользователем строка. |
// crt_sprintf.c /* Эта программа использует функции sprintf и swprintf * чтобы выполнить форматированный вывод данных. */ #include <stdio.h> int main( void ) { char string[200], s[] = "computer", с = '1'; int i = 35, j; float fp = 1.7320534f; wchar_t wch = L'w', *wstring = L"Unicode"; /* Показывает целые числа. */ sprintf( "Integer formats:\n" " Decimal: %d Justified: %.6d Unsigned: %u\n", count, count, count, count ); sprintf( "Decimal %d as:\n Hex: %Xh C hex: 0x%x Octal: %o\n", count, count, count, count ); /* Показывает в различных основаниях системы счисления. */ sprintf( "Digits 10 equal:\n Hex: %i Octal: %i Decimal: %i\n", 0x10, 010, 10 ); /* Показывает символы. */ sprintf("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch, wch); swprintf(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch, wch); /* Показывает строки. */ sprintf("Strings in field (1):\n%25s\n%25.4hs\n %S%25.3ls\n", string, string, wstring, wstring); wprintf(L"Strings in field (2):\n%25S\n%25.4hs\n %s%25.3ls\n", string, string, wstring, wstring); /* Показывает действительные числа. */ sprintf( "Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp ); /* Показывает указатели. */ sprintf( "\nAddress as: %p\n", &count); /* Счетчик печатаемых символов. */ sprintf( "\nDisplay to here:\n" ); sprintf( "1234567890123456%n78901234567890\n", &count ); sprintf( " Number displayed: %d\n\n", count ); } Вывод данныхФорматы целых чисел: Десятичный: -9234 Выравненный: -009234 Беззнаковый: 4294958062 Десятичный -9234 как: Hex(шестнадцатиричный): FFFFDBEEh C hex: 0xffffdbee Octal(восьмиричный): 37777755756 Цифра 10 эквивалентна: Hex: 16 Octal: 8 Decimal: 10 Символов в поле (1): h h w w Символов в поле (2): h h w w Строк в поле (1): computer comp Unicode Uni Строк в поле (2): computer comp Unicode Uni Действительные числа: 251.736600 251.74 2.517366e+002 2.517366E+002 Адрес как: 0012FEE0 Вывод на экран здесь: 123456789012345678901234567890 Число показанное на экране: 16
|
Процедуры поддержки плавающей запятой | Процедуры потоков ввода-вывода (I/O) | Локальные процедуры | Функции fopen | fprintf | scanf | sprintf | vprintf | Процедуры времени исполнения программы и эквиваленты .NET Framework
Процедуры |
Требуется заголовочный файл |
Совместимость |
---|---|---|
sprintf | <stdio.h> | ANSI, Win 98, Win Me, Win NT, Win 2000, Win XP |
swprintf | <stdio.h> или <wchar.h> | ANSI, Win 98, Win Me, Win NT, Win 2000, Win XP |
Дополнительную информацию о совместимости см. в статье Совместимость в главе Введение.
Все версии библиотек времени исполнения программы C.
Записывает форматированные данные в строку. Доступны более безопасные версии некоторых из этих функций; см. sprintf_s, _sprintf_s_l, swprintf_s, _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_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++ template <size_t size> int _sprintf_l( char (&buffer)[size], const char *format, locale_t locale [, argument] ... ); // только для C++ template <size_t size> int swprintf( wchar_t (&buffer)[size], size_t count, const wchar_t *format [, argument]... ); // только для C++ template <size_t size> int _swprintf_l( wchar_t (&buffer)[size], size_t count, const wchar_t *format, locale_t locale [, argument] ... ); // только для C++ |
Место хранения для выводимых данных.
countМаксимальное число символов, которое хранится в версии Unicode этой функции.
format
Параметр строки управления форматом. Это дополнительные (необязательные) параметры.
locale
Используемый язык страны (местности).
Для получения дополнительной информации, см. статью Спецификации формата.
Замечание по безопасности: При использовании функции sprintf, нет какого-либо способа ограничить число записываемых символов, что означает, что код, используя sprintf, восприимчив к переполнению буфера. Примите во внимание то, что лучше использовать связанные функции _snprintf, которая определяет максимальное число символов, которые будут записаны в буфер или _scprintf, которая определяет какой величины буфер требуется. Кроме того, обеспечьте, чтобы формат являлся не определяемой пользователем строкой. |
Функция swprintf - широкосимвольная версия sprintf; параметры указателя на swprintf - широкосимвольные строки. Обнаружение ошибок кодировки в swprintf может отличаться от того, что заложено в функции sprintf. Функции swprintf и fwprintf ведут себя тождественно за исключением того, что swprintf читает выводимые данные в строке, а не в месте назначения типа FILE, а функция swprintf, требует, чтобы параметр подсчета определил максимальное число символов, которое будет записано. Версии этих функций с суффиксом _l идентичны за исключением того, что они используют параметр языка страны (местности), переданный вместо потока текущего языка страны.
В Visual C++ 2005, функция swprintf приведена в соответствие со Стандартом C Международной Организации по Стандартизации (ISO), который требует второго параметра count, типа size_t. Чтобы заставить действовать старое нестандартное поведение функции, определите флажок _CRT_NON_CONFORMING_SWPRINTFS. В будущей версии может быть удалено старое поведение функции, таким образом код должен меняться для использования нового соответствующего стандарту поведения.
В 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_l | <stdio.h> или <wchar.h> |
Для дополнительной информации о совместимости, см. статью Совместимость во Введении.
// crt_sprintf.c // компиляция с ключом: /W3 // Эта программа использует sprintf, чтобы форматировать различные // данные и поместить их в строку, названную буфером. #include <stdio.h> int main( void ) { char buffer[200], s[] = "computer", c = 'l'; int i = 35, j; float fp = 1.7320534f; // Форматирование и распечатка различных данных: 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 // Обратите внимание: функцию sprintf не рекомендуется применять; вместо неё используйте лучше sprintf_s 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 // пример с широкими символами // также демонстрирует возвращение swprintf кода ошибки #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 завершается ошибкой, потому что строка содержит WEOF (\xffff) printf( "wrote %d characters\n", len ); } |
wrote 11 characters wrote -1 characters |
Stream I/O
Функции fprintf, _fprintf_l, fwprintf, _fwprintf_l, printf, _printf_l, wprintf, _wprintf_l, scanf, _scanf_l, wscanf, _wscanf_l, sscanf, _sscanf_l, swscanf, _swscanf_l, vprintfВсе версии библиотек времени исполнения программы C.