将设置格式的数据写入字符串。 提供这些函数的更安全版本;请参阅 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(
wchar_t *buffer,
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
参数
buffer
输出的存储位置
count
要存储在 Unicode 版的此函数中的最大字符数。
format
格式控件字符串
argument
可选自变量
locale
要使用的区域设置。
有关详细信息,请参阅格式规范语法。
返回值
写入的字符数或 -1(如果发生错误)。 如果 buffer
或 format
是空指针,则会调用无效的参数处理程序,如参数验证中所述。 如果允许继续执行,则这些函数返回 -1 并将 errno
设置为 EINVAL
。
sprintf
返回存储在 buffer
中的字节数,不包括终止 null 字符。 swprintf
返回存储在 buffer
中的宽字符数,不包括中止 null 宽字符。
注解
sprintf
函数存储 buffer
中的一系列字符和值并设置格式。 每个 argument
(如果有)根据 format
中相应的格式规范进行转换和输出。 该格式包括普通字符,其形式和函数与 format
的 printf
参数相同。 null 字符追加在写入的最后一个字符后。 如果在重叠的字符串之间发生复制,则此行为不确定。
重要
使用 sprintf
,无法限制写入的字符数,这意味着使用 sprintf
的代码容易受到缓冲区溢出的影响。 请考虑使用相关函数 snprintf
,用于指定写入 buffer
的最大字符数,或使用 _scprintf
来确定需要多大的缓冲区。 同样,确保 format
不是用户定义的字符串。
从 Windows 10 版本 2004(内部版本 19041)开始,printf
系列函数根据 IEEE 754 的舍入规则输出可精确表示的浮点数。 在早期的 Windows 版本中,以“5”结尾并且可精确表示的浮点数总是向上取整。 IEEE 754 规定它们必须舍入到最接近的偶数(也称为“四舍六入五成双”)。 例如,printf("%1.0f", 1.5)
和 printf("%1.0f", 2.5)
都应舍入为 2。 之前,1.5 舍入为 2,2.5 舍入为 3。 此更改仅影响可精确表示的数字。 例如,2.35(用于内存表示时更接近于 2.35000000000000008)仍然向上取整为 2.4。 这些函数完成的舍入现在也遵循 fesetround
设置的浮点舍入模式。 以前,舍入始终选择 FE_TONEAREST
行为。 此更改仅影响使用 Visual Studio 2019 版本 16.2 及更高版本生成的程序。 若要使用旧的浮点舍入行为,请链接到 'legacy_stdio_float_rounding.obj`。
swprintf
是 sprintf
的宽字符版本; swprintf
的指针参数是宽字符串。 swprintf
中的编码错误检测可能与 sprintf
中的不同。 swprintf
和 fwprintf
行为完全相同,只不过 swprintf
将输出写入到一个字符串,而不是 FILE
类型的目标,并且 swprintf
需要 count
参数来指定要写入的最大字符数。 这些带有 _l
后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。
在标准化 swprintf
签名之前,旧版 Microsoft C 运行时库中提供的版本不采用字符计数参数。 旧版本仍然可以在 Microsoft C 运行时库中使用,但其已被弃用并重命名为 _swprintf()
。 对于针对旧版签名编写的代码,请定义 _CRT_NON_CONFORMING_SWPRINTFS
,以将对 swprintf
的调用映射到 _swprintf
。 在未来版本中,可能会删除旧行为,因此应将代码更改为使用新的符合标准行为。
在 C++ 中,这些函数具有模板重载,以调用这些函数的更新、更安全副本。 有关详细信息,请参阅安全模板重载。
一般文本例程映射
TCHAR.H 例程 |
_UNICODE 和 _MBCS 未定义 |
_MBCS 已定义 |
_UNICODE 已定义 |
---|---|---|---|
_stprintf |
sprintf |
sprintf |
_swprintf |
_stprintf_l |
_sprintf_l |
_sprintf_l |
__swprintf_l |
要求
例程 | 必需的标头 |
---|---|
%> | <stdio.h> |
.- . | <stdio.h> 或 <wchar.h> |
有关兼容性的详细信息,请参阅 兼容性。
示例:使用 sprintf
格式化数据
// 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 );
}
Output:
String: computer
Character: l
Integer: 35
Real: 1.732053
character count = 79
示例:错误代码处理
// 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 );
}
wrote 11 characters
wrote -1 characters