Share via


sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

向字符串写入设置数据格式。 这些是 sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l 的版本与安全增强的 CRT中的安全功能如中所述。

int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format [,
   argument] ... 
);
int _sprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format,
   locale_t locale [,
   argument] ... 
);
int swprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format [,
   argument]...
);
int _swprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   locale_t locale [,
   argument]…
);
template <size_t size>
int sprintf_s(
   char (&buffer)[size],
   const char *format [,
   argument] ... 
); // C++ only
template <size_t size>
int swprintf_s(
   wchar_t (&buffer)[size],
   const wchar_t *format [,
   argument]...
); // C++ only

参数

  • buffer
    输出的存储位置

  • sizeOfBuffer
    存储的最大字符数。

  • format
    窗体控件字符串

  • argument
    可选参数

  • locale
    使用的区域设置。

有关更多信息,请参见 格式规范

返回值

编写的字符数或 – 1,如果错误。 如果 buffer 或 format 是 null 指针, sprintf_s 和 swprintf_s 返回 -1 并将 errno 到 EINVAL。

sprintf_s 返回在 buffer存储字节数,不包括终止 null 字符)。 swprintf_s 返回在 buffer存储的宽字符数,不包括终止 null 宽字符。

备注

sprintf_s 函数在 buffer设置格式并存储一系列字符和值。 每 argument (如果有) 基于在 format相应的格式规范转换和输出。 该格式包括普通字符并具有窗体和功能和 printf的 format 参数相同。 null 字符从右向左书写的最后一个字符之后追加。 如果复制出现在重叠的字符串之间,该行为不确定。

sprintf_s 和 sprintf 之间的主要差异是 sprintf_s 检查格式字符串的格式无效字符, sprintf ,而只检查格式字符串或缓冲区是否 NULL 指针。 如果任何检查失败,无效参数调用处理程序,如 参数验证所述。 如果执行允许继续,该函数返回 -1 并将 errno 到 EINVAL。

sprintf_s 和 sprintf 之间的另一个主要区别在于 sprintf_s 带有指定输出区域的大小长度参数在字符。 如果缓冲区为因此打印的文本太小缓冲区设置为空字符串,而无效参数调用处理程序。 不同 snprintf, sprintf_s 确保缓冲区将 null 终止 (除非缓冲区大小为零)。

swprintf_s 是 sprintf_s的宽字符版本;为 swprintf_s 的指针参数是宽字符字符串。 编码错误的检测到 swprintf_s 的可能与在 sprintf_s。 这些功能的版本与 _l 后缀的相同,只不过它们使用区域设置参数而不是当前线程区域设置。

在 C++ 中,使用这些功能由模板重载简化;重载可推断缓冲区长度 (自动不再需要指定范围参数),并且还可以用以较新,安全重复自动替换旧,不安全的功能。 有关更多信息,请参见 安全模板重载

具有提供对 sprintf_s 的版本时所发生的其他控件,如果缓冲区太小。 有关更多信息,请参见 _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l

一般文本例程映射

TCHAR.H 实例

未定义的 _UNICODE _MBCS

定义的 _MBCS

定义的 _UNICODE

_stprintf_s

sprintf_s

sprintf_s

swprintf_s

_stprintf_s_l

_sprintf_s_l

_sprintf_s_l

_swprintf_s_l

要求

实例

必需的头

sprintf_s, _sprintf_s_l

stdio.h

swprintf_s, _swprintf_s_l

stdio.h 或 wchar.h

有关其他的兼容性信息,请参见中介绍的 兼容性

示例

// crt_sprintf_s.c
// This program uses sprintf_s 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_s( buffer, 200,     "   String:    %s\n", s );
   j += sprintf_s( buffer + j, 200 - j, "   Character: %c\n", c );
   j += sprintf_s( buffer + j, 200 - j, "   Integer:   %d\n", i );
   j += sprintf_s( buffer + j, 200 - j, "   Real:      %f\n", fp );

   printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
  
// crt_swprintf_s.c
// wide character example
// also demonstrates swprintf_s returning error code
#include <stdio.h>

int main( void )
{
   wchar_t buf[100];
   int len = swprintf_s( buf, 100, L"%s", L"Hello world" );
   printf( "wrote %d characters\n", len );
   len = swprintf_s( buf, 100, L"%s", L"Hello\xffff world" );
   // swprintf_s fails because string contains WEOF (\xffff)
   printf( "wrote %d characters\n", len );
}
  

.NET Framework 等效项

[M:System::String::Format]

请参见

参考

流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功能