sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
向字符串写入设置数据格式。 这些是 sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l 的版本与安全增强的 CRT中的安全功能如中所述。
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format [,
argument] ...
);
int _sprintf_s_l(
char *buffer,
size_t sizeOfBuffer,
const char *format,
locale_t locale [,
argument] ...
);
int swprintf_s(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format [,
argument]...
);
int _swprintf_s_l(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format,
locale_t locale [,
argument]…
);
template <size_t size>
int sprintf_s(
char (&buffer)[size],
const char *format [,
argument] ...
); // C++ only
template <size_t size>
int swprintf_s(
wchar_t (&buffer)[size],
const wchar_t *format [,
argument]...
); // C++ only
参数
buffer
输出的存储位置sizeOfBuffer
存储的最大字符数。format
窗体控件字符串argument
可选参数locale
使用的区域设置。
有关更多信息,请参见 格式规范。
返回值
编写的字符数或 – 1,如果错误。 如果 buffer 或 format 是 null 指针, sprintf_s 和 swprintf_s 返回 -1 并将 errno 到 EINVAL。
sprintf_s 返回在 buffer存储字节数,不包括终止 null 字符)。 swprintf_s 返回在 buffer存储的宽字符数,不包括终止 null 宽字符。
备注
sprintf_s 函数在 buffer设置格式并存储一系列字符和值。 每 argument (如果有) 基于在 format相应的格式规范转换和输出。 该格式包括普通字符并具有窗体和功能和 printf的 format 参数相同。 null 字符从右向左书写的最后一个字符之后追加。 如果复制出现在重叠的字符串之间,该行为不确定。
sprintf_s 和 sprintf 之间的主要差异是 sprintf_s 检查格式字符串的格式无效字符, sprintf ,而只检查格式字符串或缓冲区是否 NULL 指针。 如果任何检查失败,无效参数调用处理程序,如 参数验证所述。 如果执行允许继续,该函数返回 -1 并将 errno 到 EINVAL。
sprintf_s 和 sprintf 之间的另一个主要区别在于 sprintf_s 带有指定输出区域的大小长度参数在字符。 如果缓冲区为因此打印的文本太小缓冲区设置为空字符串,而无效参数调用处理程序。 不同 snprintf, sprintf_s 确保缓冲区将 null 终止 (除非缓冲区大小为零)。
swprintf_s 是 sprintf_s的宽字符版本;为 swprintf_s 的指针参数是宽字符字符串。 编码错误的检测到 swprintf_s 的可能与在 sprintf_s。 这些功能的版本与 _l 后缀的相同,只不过它们使用区域设置参数而不是当前线程区域设置。
在 C++ 中,使用这些功能由模板重载简化;重载可推断缓冲区长度 (自动不再需要指定范围参数),并且还可以用以较新,安全重复自动替换旧,不安全的功能。 有关更多信息,请参见 安全模板重载。
具有提供对 sprintf_s 的版本时所发生的其他控件,如果缓冲区太小。 有关更多信息,请参见 _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l。
一般文本例程映射
TCHAR.H 实例 |
未定义的 _UNICODE _MBCS |
定义的 _MBCS |
定义的 _UNICODE |
---|---|---|---|
_stprintf_s |
sprintf_s |
sprintf_s |
swprintf_s |
_stprintf_s_l |
_sprintf_s_l |
_sprintf_s_l |
_swprintf_s_l |
要求
实例 |
必需的头 |
---|---|
sprintf_s, _sprintf_s_l |
stdio.h |
swprintf_s, _swprintf_s_l |
stdio.h 或 wchar.h |
有关其他的兼容性信息,请参见中介绍的 兼容性 。
示例
// crt_sprintf_s.c
// This program uses sprintf_s 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_s( buffer, 200, " String: %s\n", s );
j += sprintf_s( buffer + j, 200 - j, " Character: %c\n", c );
j += sprintf_s( buffer + j, 200 - j, " Integer: %d\n", i );
j += sprintf_s( buffer + j, 200 - j, " Real: %f\n", fp );
printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
// crt_swprintf_s.c
// wide character example
// also demonstrates swprintf_s returning error code
#include <stdio.h>
int main( void )
{
wchar_t buf[100];
int len = swprintf_s( buf, 100, L"%s", L"Hello world" );
printf( "wrote %d characters\n", len );
len = swprintf_s( buf, 100, L"%s", L"Hello\xffff world" );
// swprintf_s fails because string contains WEOF (\xffff)
printf( "wrote %d characters\n", len );
}
.NET Framework 等效项
[M:System::String::Format]
请参见
参考
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l
scanf, _scanf_l, wscanf, _wscanf_l