sprintf, _sprintf_l, swprintf, _swprintf, _swprintf_l, __swprintf_l

将设置格式的数据写入字符串。 提供这些函数的更安全版本;请参阅 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 函数