_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l
Записи форматировали данные в строке.Эти версии _snprintf, _snprintf_l, _snwprintf, _snwprintf_l со службами расширений безопасности, как описано в разделе Средства безопасности в CRT.
int _snprintf_s(
char *buffer,
size_t sizeOfBuffer,
size_t count,
const char *format [,
argument] ...
);
int _snprintf_s_l(
char *buffer,
size_t sizeOfBuffer,
size_t count,
const char *format,
locale_t locale [,
argument] ...
);
int _snwprintf_s(
wchar_t *buffer,
size_t sizeOfBuffer,
size_t count,
const wchar_t *format [,
argument] ...
);
int _snwprintf_s_l(
wchar_t *buffer,
size_t sizeOfBuffer,
size_t count,
const wchar_t *format,
locale_t locale [,
argument] ...
);
template <size_t size>
int _snprintf_s(
char (&buffer)[size],
size_t count,
const char *format [,
argument] ...
); // C++ only
template <size_t size>
int _snwprintf_s(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format [,
argument] ...
); // C++ only
Параметры
buffer
Место хранения для вывода.sizeOfBuffer
Размер места хранения для вывода.Размер in bytes для _snprintf_s размер in words для _snwprintf_s.Count
Максимальное число символов, которые необходимо сохранить или _TRUNCATE.format
Строка Формат-элемента управления.argument
Необязательные аргументы.locale
Языковой стандарт, который необходимо использовать.
Возвращаемое значение
_snprintf_s возвращает число знаков, хранящихся внутри bufferподсчет, которая не нуль-символ._snwprintf_s возвращает количество расширенных символов, расположенных в bufferподсчет null, не заканчивающийся расширенный символ.
Если хранилище, необходимые для данных и заканчивающийся null превышает stored sizeOfBufferнедопустимый параметр, обработчик вызывается, как описано в разделе Проверка параметров.Если выполнение продолжается после обработчика недопустимого параметра, то эти функции установки buffer значение пустой строки, установите errno В ERANGEи извлечение -1.
If buffer OR format a NULL указатель или count меньше или равно нулю, недопустимый вызывается обработчик параметра.Если выполнение может быть продолжено, то эти функции установки errno В EINVAL и равен -1.
Дополнительные сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.
Заметки
_snprintf_s форматы функции и сохраняют count или меньшее число символов в buffer append и заканчивающийся null.Каждый аргумент (если таковые имеются), преобразуется и выход в соответствии с соответствующим спецификации формата in format.Форматирование согласовано с printf семейство функций; см. Синтаксис описания формата: функции printf и wprintf.Если копирование происходит между строками, которые перекрываются функциональности не определено.
If count существует _TRUNCATEпосле этого _snprintf_s записи многие строки по размерам buffer при покидающ места для конечного null.Если все соответствия строки (с завершения null) внутри bufferпосле этого _snprintf_s возвращает число записанных символов (не включая конечное значение null). в противном случае - _snprintf_s возвращает -1 для указания того, что возникло усечение.
Примечание по безопасности |
---|
Убедитесь, что format не является определяемой пользователем строкой. |
_snwprintf_s версия расширенных символов _snprintf_s; аргументы указателя на _snwprintf_s характерные черты.Обнаружение ошибок кодирования in _snwprintf_s может отличаться от in _snprintf_s._snwprintf_sкак swprintf_sданные в строке, а не в целевой тип FILE.
Версии этих функций с _l суффикс идентичны за исключением того, что они используют параметр, переданный вместо языкового стандарта текущего языкового стандарта потока.
В C++ с помощью этих функций упрощает перегрузками шаблона; перегруженные методы могут определять длина буфера, автоматически (что устраняет необходимость указать аргумент size) и они могут автоматически заменять старые, non-безопасные функции с их новыми, безопасный копиями.Дополнительные сведения см. в разделе Предоставляйте перегруженный шаблона.
Сопоставления подпрограммы Родов-Текста
Подпрограмма Tchar.h |
Не указанные _UNICODE и _MBCS |
Указанный символ _MBCS |
Указанный _UNICODE |
---|---|---|---|
_sntprintf_s |
_snprintf_s |
_snprintf_s |
_snwprintf_s |
_sntprintf_s_l |
_snprintf_s_l |
_snprintf_s_l |
_snwprintf_s_l |
Требования
Процедура |
Обязательный заголовок |
---|---|
_snprintf_s, _snprintf_s_l |
<stdio.h> |
_snwprintf_s, _snwprintf_s_l |
<stdio.h> OR <wchar.h> |
Дополнительные сведения о совместимости см. Совместимость во введении.
Пример
// crt_snprintf_s.cpp
// compile with: /MTd
// These #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h> // For _CrtSetReportMode
#include <errno.h>
// This example uses a 10-byte destination buffer.
int snprintf_s_tester( const char * fmt, int x, int count )
{
char dest[10];
printf( "\n" );
if ( count == _TRUNCATE )
printf( "%d-byte buffer; truncation semantics\n",
_countof(dest) );
else
printf( "count = %d; %d-byte buffer\n",
count, _countof(dest) );
int ret = _snprintf_s( dest, _countof(dest), count, fmt, x );
printf( " new contents of dest: '%s'\n", dest );
return ret;
}
void Examples()
{
// formatted output string is 9 characters long: "<<<123>>>"
snprintf_s_tester( "<<<%d>>>", 121, 8 );
snprintf_s_tester( "<<<%d>>>", 121, 9 );
snprintf_s_tester( "<<<%d>>>", 121, 10 );
printf( "\nDestination buffer too small:\n" );
snprintf_s_tester( "<<<%d>>>", 1221, 10 );
printf( "\nTruncation examples:\n" );
int ret = snprintf_s_tester( "<<<%d>>>", 1221, _TRUNCATE );
printf( " truncation %s occur\n", ret == -1 ? "did"
: "did not" );
ret = snprintf_s_tester( "<<<%d>>>", 121, _TRUNCATE );
printf( " truncation %s occur\n", ret == -1 ? "did"
: "did not" );
printf( "\nSecure template overload example:\n" );
char dest[10];
_snprintf( dest, 10, "<<<%d>>>", 12321 );
// With secure template overloads enabled (see #defines
// at top of file), the preceding line is replaced by
// _snprintf_s( dest, _countof(dest), 10, "<<<%d>>>", 12345 );
// Instead of causing a buffer overrun, _snprintf_s invokes
// the invalid parameter handler.
// If secure template overloads were disabled, _snprintf would
// write 10 characters and overrun the dest buffer.
printf( " new contents of dest: '%s'\n", dest );
}
void myInvalidParameterHandler(
const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}
int main( void )
{
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
Examples();
}
Эквивалент в .NET Framework
Неприменимо. Для c# используйте стандартная функция PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.
См. также
Ссылки
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l
scanf, _scanf_l, wscanf, _wscanf_l