Share via


sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l

将格式数据写入字符串。 有关这些函数的更多安全版本,请参见 sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l。 swprintf 和 _swprintf_l 的安全版本不采用 count 参数。

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_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
template <size_t size>
int swprintf(
   wchar_t (&buffer)[size],
   const wchar_t *format [,
   argument]...
); // C++ only
template <size_t size>
int _swprintf_l(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   locale_t locale [,
   argument] ... 
); // C++ only

参数

  • buffer
    输出的存储位置

  • count
    此函数的 Unicode 版所存储的最大字符数。

  • format
    窗体控件字符串

  • argument
    可选参数

  • locale
    要使用的区域设置。

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

返回值

如果发生错误,则编写的字符数或减 1。 如果 buffer 或 format 是 null 指针,则会调用无效参数处理程序,如 参数验证 中所述。 如果允许执行继续,则这些函数返回 -1 并将 errno 设置为 EINVAL。

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

备注

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

安全说明安全说明

使用 sprintf,无法限制编写的字符数,这意味着,使用 sprintf 的代码易出现缓冲区溢出。考虑使用相关函数 _snprintf,该函数指定可写入 buffer 的最大字符数,或使用 _scprintf 来确定需要多大缓冲区。此外,请确保 format 不是用户定义的字符串。

swprintf 是 sprintf的宽字符版本;为 swprintf 的指针参数是宽字符字符串。 swprintf 中的编码错误检测可能与 sprintf 中的不同。 swprintf 和 fwprintf 运行方式相同,但 swprintf 向字符串而不是向 FILE 类型的目标写入字符串,并且,swprintf 需要 count 参数指定要写入的最大字符数。 这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。

swprintf 符合 ISO C 标准,需要 size_t 类型的第二个参数,即count。 若要强制进行早期非标准行为,请定义 _CRT_NON_CONFORMING_SWPRINTFS。 在将来的版本中,旧行为可能移除,因此,应更改代码以使用新的一致性行为。

在 C++ 中,这些函数具有模板重载,以调用这些函数的更新、更安全副本。 有关详细信息,请参阅 安全模板重载

一般文本例程映射

TCHAR.H 例程

未定义 _UNICODE & _MBCS

已定义 _MBCS

已定义 _UNICODE

_stprintf

sprintf

sprintf

swprintf

_stprintf_l

_sprintf_l

_sprintf_l

__swprintf_l

要求

例程

必需的标头

sprintf, _sprintf_l

<stdio.h>

swprintf, _swprintf_l

<stdio.h> 或 <wchar.h>

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

示例

// 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 );
}
  
// 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 );
}
  

.NET Framework 等效项

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 函数