将设置格式的数据写入字符串。 提供这些函数的更安全版本;请参阅 sprintf_s_sprintf_s_lswprintf_s_swprintf_s_lswprintf_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(如果发生错误)。 如果 bufferformat 是空指针,则会调用无效的参数处理程序,如参数验证中所述。 如果允许继续执行,则这些函数返回 -1 并将 errno 设置为 EINVAL

sprintf 返回存储在 buffer中的字节数,不包括终止 null 字符。 swprintf 返回存储在 buffer 中的宽字符数,不包括中止 null 宽字符。

注解

sprintf 函数存储 buffer 中的一系列字符和值并设置格式。 每个 argument (如果有)根据 format中相应的格式规范进行转换和输出。 该格式包括普通字符,其形式和函数与 formatprintf 参数相同。 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`

swprintfsprintf的宽字符版本; swprintf 的指针参数是宽字符串。 swprintf 中的编码错误检测可能与 sprintf 中的不同。 swprintffwprintf 行为完全相同,只不过 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

另请参阅

流 I/O




vprintf 函数