利用指定参数在格式字符串中使用的顺序的能力将带格式的数据写入字符串。
语法
int _sprintf_p(
char *buffer,
size_t sizeOfBuffer,
const char *format [,
argument_list]
);
int _sprintf_p_l(
char *buffer,
size_t sizeOfBuffer,
const char *format,
_locale_t locale [,
argument_list]
);
int _swprintf_p(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format [,
argument_list]
);
int _swprintf_p_l(
wchar_t *buffer,
size_t sizeOfBuffer,
const wchar_t *format,
_locale_t locale [,
argument_list]
);
参数
buffer
输出的存储位置
sizeOfBuffer
可存储的最多字符数。
format
窗体控件字符串。
argument_list
格式字符串的可选参数。
locale
要使用的区域设置。
有关详细信息,请参阅格式规范语法。
返回值
写入的字符数或 -1(如果发生错误)。
备注
_sprintf_p
函数存储 buffer
中的一系列字符和值并设置格式。 argument_list
中的每个参数(如果有)根据 format
中相应的格式规范进行转换和输出。 format
参数使用 printf
和 wprintf
函数的格式规范语法。 null 字符追加在写入的最后一个字符后。 如果在重叠的字符串之间发生复制,则此行为不确定。 _sprintf_p
和 sprintf_s
之间的差异在于 _sprintf_p
支持位置参数,这允许指定格式字符串中使用参数的顺序。 有关详细信息,请参阅 printf_p
位置参数。
_swprintf_p
是 _sprintf_p
的宽字符版本; _swprintf_p
的指针参数是宽字符串。 _swprintf_p
中的编码错误检测可能与 _sprintf_p
中的检测不同。 _swprintf_p
和 fwprintf_p
行为完全相同,只不过 _swprintf_p
将输出写入到一个字符串,而不是类型 FILE
的目标,并且 _swprintf_p
需要 count
参数来指定要写入的最大字符数。 这些带有 _l
后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。
_sprintf_p
返回存储在 buffer
中的字节数,不包括终止 null 字符。 _swprintf_p
返回存储在 buffer
中的宽字符数,不包括中止 null 宽字符。 如果 buffer
或 format
为 null 指针,或如果格式字符串包含无效格式字符,则将调用无效参数处理程序,如参数验证中所述。 如果允许继续执行,则这些函数返回 -1 并将 errno
设置为 EINVAL
。
重要
从 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`。
一般文本例程映射
TCHAR.H 例程 |
_UNICODE 和 _MBCS 未定义 |
_MBCS 已定义 |
_UNICODE 已定义 |
---|---|---|---|
_stprintf_p |
_sprintf_p |
_sprintf_p |
_swprintf_p |
_stprintf_p_l |
_sprintf_p_l |
_sprintf_p_l |
_swprintf_p_l |
要求
例程 | 必需的标头 |
---|---|
%> | <stdio.h> |
%> | <stdio.h> 或 <wchar.h> |
有关兼容性的详细信息,请参阅 兼容性。
示例:使用 _sprintf_p
格式化数据
// crt_sprintf_p.c
// This program uses _sprintf_p 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_p( buffer, 200,
" String: %s\n", s );
j += _sprintf_p( buffer + j, 200 - j,
" Character: %c\n", c );
j += _sprintf_p( buffer + j, 200 - j,
" Integer: %d\n", i );
j += _sprintf_p( buffer + j, 200 - j,
" Real: %f\n", fp );
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_p.c
// This is the wide character example which
// also demonstrates _swprintf_p returning
// error code.
#include <stdio.h>
#define BUFFER_SIZE 100
int main( void )
{
wchar_t buffer[BUFFER_SIZE];
int len;
len = _swprintf_p(buffer, BUFFER_SIZE, L"%2$s %1$d",
0, L" marbles in your head.");
_printf_p( "Wrote %d characters\n", len );
// _swprintf_p fails because string contains WEOF (\xffff)
len = _swprintf_p(buffer, BUFFER_SIZE, L"%s",
L"Hello\xffff world" );
_printf_p( "Wrote %d characters\n", len );
}
Wrote 24 characters
Wrote -1 characters