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 等效项
请参见
参考
fprintf、_fprintf_l、fwprintf、_fwprintf_l
printf、_printf_l、wprintf、_wprintf_l
scanf、_scanf_l、wscanf、_wscanf_l