sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
向字符串写入设置数据格式。其中一些的更安全版本功能可用; sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l参见。swprintf 和 _swprintf_l 的安全版本不采用 count 参数。
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++ only
template <size_t size>
int _sprintf_l(
char (&buffer)[size],
const char *format,
locale_t locale [,
argument] ...
); // C++ only
template <size_t size>
int swprintf(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format [,
argument]...
); // C++ only
template <size_t size>
int _swprintf_l(
wchar_t (&buffer)[size],
size_t count,
const wchar_t *format,
locale_t locale [,
argument] ...
); // C++ only
参数
buffer
输出的存储位置count
存储的最大字符数此函数的 Unicode 版本。format
窗体控件字符串argument
可选参数locale
使用的区域设置。
有关更多信息,请参见 格式规范。
返回值
编写的字符数或 – 1,如果错误。如果 buffer 或 format 是 null 指针,无效参数调用处理程序,如 参数验证所述。如果执行允许继续,这些函数返回 -1 并将 errno 到 EINVAL。
sprintf 返回在 buffer存储字节数,不包括终止 null 字符)。swprintf返回在 buffer存储的宽字符数,不包括终止 null 宽字符。
备注
sprintf 函数在 buffer设置格式并存储一系列字符和值。每 argument (如果有) 基于在 format相应的格式规范转换和输出。该格式包括普通字符并具有窗体和功能和 printf的 format 参数相同。null 字符从右向左书写的最后一个字符之后追加。如果复制出现在重叠的字符串之间,该行为不确定。
安全说明 |
---|
使用 sprintf,无法限制编写的字符数,这意味着,使用 sprintf 的代码易出现缓冲区溢出。考虑使用相关功能 _snprintf,指定向 buffer要写入的最大字符数,或使用 _scprintf 确定大需要缓冲。另外,请确保 format 不是用户定义的字符串。 |
swprintf 是 sprintf的宽字符版本;为 swprintf 的指针参数是宽字符字符串。编码错误的检测到 swprintf 的可能与在 sprintf。swprintf 和 fwprintf 具有相同的行为,但 swprintf 将输出写入的字符串而不是类型 FILE的目标,并且, swprintf 需要 count参数指定要写入的最大字符数。这些功能的版本与 _l 后缀的相同,只不过它们使用区域设置参数而不是当前线程区域设置。
swprintf 符合 ISO C 标准,需要第二个参数, 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
// 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 );
}
// 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 );
}
.NET Framework 等效项
请参见
参考
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l
scanf, _scanf_l, wscanf, _wscanf_l