将设置格式的数据写入字符串。 提供这些函数的更安全版本;请参阅 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
另请参阅
              流 I/O
              
              fprintf, _fprintf_l, fwprintf, _fwprintf_l
              
              printf, _printf_l, wprintf, _wprintf_l
              
              scanf, _scanf_l, wscanf, _wscanf_l
              
              sscanf, _sscanf_l, swscanf, _swscanf_l
              
              vprintf 函数