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 等效项
请参见
参考
fprintf、_fprintf_l、fwprintf、_fwprintf_l
printf、_printf_l、wprintf、_wprintf_l
scanf、_scanf_l、wscanf、_wscanf_l