vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
| 定义于头文件 <stdio.h>
|
||
int vprintf( const char* format, va_list vlist );
|
(1) | (直到 C99) |
int vprintf( const char* restrict format, va_list vlist );
|
(自 C99 起) | |
int vfprintf( FILE* stream, const char* format, va_list vlist );
|
(2) | (直到 C99) |
int vfprintf( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(自 C99 起) | |
int vsprintf( char* buffer, const char* format, va_list vlist );
|
(3) | (直到 C99) |
int vsprintf( char* restrict buffer, const char* restrict format,
va_list vlist );
|
(自 C99 起) | |
int vsnprintf( char* restrict buffer, size_t bufsz,
const char* restrict format, va_list vlist );
|
(4) | (自 C99 起) |
int vprintf_s( const char* restrict format, va_list vlist );
|
(5) | (自 C11 起) |
int vfprintf_s( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(6) | (自 C11 起) |
int vsprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, va_list vlist );
|
(7) | (自 C11 起) |
int vsnprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, va_list vlist );
|
(8) | (自 C11 起) |
从由 vlist 定义的位置加载数据,将它们转换为等效的字符串,并将结果写入多种目标。
stream。buffer。buffer。最多写入 bufsz - 1 个字符。除非 bufsz 为零,否则结果字符串将以空字符终止。如果 bufsz 为零,则什么也不写,且 buffer 可以为空指针,但返回值(不包括空终止符的应写入字节数)仍会被计算并返回。- 格式字符串中存在转换说明符
%nformat - 与
%s对应的任一参数为空指针 formatbuffer为空指针bufsz为零或大于- RSIZE_MAX
- 任何字符串和字符转换说明符中出现编码错误
vsprintf_s(仅针对buffer)将要存储到bufsz
vprintf_s
与所有边界检查函数一样,vfprintf_s、vsprintf_s、vsnprintf_s 和 __STDC_LIB_EXT1__ 只有在实现定义了 __STDC_WANT_LIB_EXT1__ 并且用户在包含 1 之前将 < 定义为整数常量 > 时才保证可用。参数
| stream | - | 要写入的输出文件流 |
| buffer | - | 指向要写入的字符串的指针 |
| bufsz | - | 最多可以写入 bufsz - 1 个字符,加上空终止符
|
| format | - | 指向空终止字符串的指针,指定如何解释数据 |
| vlist | - | 包含要打印数据的可变参数列表。 |
format 格式字符串由普通字节字符(除了 %)组成,这些字符被原样复制到输出流中,以及转换说明。每个转换说明具有以下格式:
- 引入的
%字符。
- 引入的
- (可选)一个或多个修改转换行为的标志:
-:转换结果在字段内左对齐(默认为右对齐)。+:有符号转换的符号总是附加在转换结果之前(默认情况下,仅当结果为负数时才在前面添加负号)。- 空格:如果有符号转换的结果不以符号字符开头,或者是空的,则会在结果前加上空格。如果存在
+标志,则忽略该标志。 #:替代形式的转换被执行。请参阅下表以了解确切效果,否则行为未定义。0:对于整数和浮点数转换,使用前导零填充字段,而不是空格字符。对于整数,如果显式指定了精度,则忽略此标志。对于其他转换,使用此标志会导致未定义行为。如果存在-标志,则忽略此标志。
- (可选)整数值或
*,指定最小字段宽度。结果根据需要填充空格字符(默认),右对齐时在左侧填充,左对齐时在右侧填充。当使用*时,宽度由类型为int的附加参数指定,该参数出现在要转换的参数之前,并在提供精度参数之前出现。如果参数值为负,结果将指定-标志并取正字段宽度(注意:这是最小宽度:值永远不会被截断)。
- (可选)整数值或
- (可选)
.后面跟整数或*,或者不跟,指定转换的精度。当使用*时,精度由类型为int的附加参数指定,该参数出现在要转换的参数之前,但在提供最小字段宽度的参数之后。如果此参数值为负,则忽略。如果既没有数字也没有*,则精度取为零。请参阅下表以了解精度的确切效果。
- (可选)
- (可选) 长度修饰符,指定参数的大小(与转换格式说明符一起,指定相应参数的类型)。
- 转换格式说明符。
以下格式说明符可用:
| 转换 说明符 |
解释 | 期望 参数类型 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 长度修饰符→ | hh | h | 无 | l | ll | j | z | t | L | |
| 仅自 C99 起可用→ | 是 | 是 | 是 | 是 | 是 | |||||
%
|
写入字面量 %。完整转换说明必须是 %%。
|
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
写入一个字符。
|
N/A | N/A | int |
wint_t |
N/A | N/A | N/A | N/A | N/A |
s
|
写入一个字符串。
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
di
|
将有符号整数转换为十进制表示形式 [-]dddd。 精度指定出现的最少数字位数。默认精度为
|
signed char |
short |
int |
long |
long long |
※ |
ptrdiff_t |
N/A |
(可选) |
bB (C23)
将一个 |
无符号整数转换为二进制表示形式 bbbb。 精度
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
unsigned version of ptrdiff_t |
N/A |
o
|
将一个无符号整数转换为八进制表示形式 oooo。
|
N/A | ||||||||
xX
|
将一个无符号整数转换为十六进制表示形式 hhhh。
|
。 | ||||||||
u
|
N/A将一个无符号整数转换为十进制表示形式 dddd
|
,则转换结果不产生字符。 | ||||||||
fF N/A
|
(C99)将浮点数转换为十进制表示法,格式为 [-]ddd.ddd
|
。 | N/A | double |
double N/A |
(C99) | N/A | N/A | N/A | long double |
eE
|
N/A将浮点数
|
。 | N/A | N/A | N/A | N/A | N/A | |||
aA
N/A |
(C99)将浮点数
|
。 | N/A | N/A | N/A | N/A | N/A | |||
gG
|
N/A将浮点数转换为十进制或十进制指数表示法,具体取决于值和精度
|
。 | N/A | N/A | N/A | N/A | N/A | |||
n
|
N/A返回此函数调用到目前为止已写入的字符数
|
signed char* |
short* |
int* |
long* |
long long* |
intmax_t * |
※ |
ptrdiff_t * |
N/A |
p
|
写入一个由实现定义的字符序列,用于定义一个指针。 |
N/A | N/A | void* |
N/A | N/A | N/A | N/A | N/A | N/A |
| 注解 | ||||||||||
|
浮点数转换函数将无穷大转换为 非数字转换为 转换 用于打印 固定宽度字符类型(int8_t 等)的正确转换说明符定义在头文件 <inttypes.h> 中(虽然 PRIdMAX、PRIuMAX 等与 内存写入转换说明符 在每个转换说明符的操作之后有一个序列点;这允许将多个 如果转换规范无效,则行为未定义。 | ||||||||||
返回值
buf_size 限制而被截断,则函数返回如果不施加限制本应写入的字符总数(不包括终止空字节)。buffer 的字符数(不包括空字符,只要 buffer 不是空指针且 bufsz 不为零且不大于 RSIZE_MAX,就始终会写入空字符),如果运行时常量违规则为零,如果编码错误则为负值。buffer 不是空指针且 bufsz 不为零且不大于 RSIZE_MAX,就始终会写入该字符),如果忽略 buffer,即本应写入 bufsz 的字符数,如果发生运行时常量违规或编码错误则为负值。注解
所有这些函数至少调用一次 va_arg,返回后 arg 的值是不确定的。这些函数不调用 va_end,必须由调用者完成。
vsnprintf_s与 vsprintf_s 不同,buffer 会将结果截断以适合指向的数组。
vsnprintf_s 在 Microsoft CRT 中的实现不符合 C 标准。微软的版本在第三个位置有一个额外的参数 size_t count,该参数包含要写入的最大字符数(不包括空终止符)。此参数可能与通过参数 size_t bufsz 提供的缓冲区大小不同。
示例
#include <stdarg.h>
#include <stdio.h>
#include <time.h>
void debug_log(const char* fmt, ...)
{
struct timespec ts;
timespec_get(&ts, TIME_UTC);
char time_buf[100];
size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec));
snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000);
va_list args1;
va_start(args1, fmt);
va_list args2;
va_copy(args2, args1);
char buf[1+vsnprintf(NULL, 0, fmt, args1)];
va_end(args1);
vsnprintf(buf, sizeof buf, fmt, args2);
va_end(args2);
printf("%s [debug]: %s\n", time_buf, buf);
}
int main(void)
{
debug_log("Logging, %d, %d, %d", 1, 2, 3);
}可能的输出:
02/20/15 21:58:09.072683 UTC [debug]: Logging, 1, 2, 3参考文献
- C23 标准 (ISO/IEC 9899:2024):
- 7.21.6.8 vfprintf 函数 (p: TBD)
- 7.21.6.10 vprintf 函数 (p: TBD)
- 7.21.6.12 vsnprintf 函数 (p: TBD)
- 7.21.6.13 vsprintf 函数 (p: TBD)
- K.3.5.3.8 vfprintf_s 函数 (p: TBD)
- K.3.5.3.10 vprintf_s 函数 (p: TBD)
- K.3.5.3.12 vsnprintf_s 函数 (p: TBD)
- K.3.5.3.13 vsprintf_s 函数 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018):
- 7.21.6.8 vfprintf 函数 (p: 238)
- 7.21.6.10 vprintf 函数 (p: 239)
- 7.21.6.12 vsnprintf 函数 (p: 239-240)
- 7.21.6.13 vsprintf 函数 (p: 240)
- K.3.5.3.8 vfprintf_s 函数 (p: 434)
- K.3.5.3.10 vprintf_s 函数 (p: 435)
- K.3.5.3.12 vsnprintf_s 函数 (p: 436-437)
- K.3.5.3.13 vsprintf_s 函数 (p: 437)
- C11 标准 (ISO/IEC 9899:2011):
- 7.21.6.8 vfprintf 函数 (p: 326-327)
- 7.21.6.10 vprintf 函数 (p: 328)
- 7.21.6.12 vsnprintf 函数 (p: 329)
- 7.21.6.13 vsprintf 函数 (p: 329)
- K.3.5.3.8 vfprintf_s 函数 (p: 597)
- K.3.5.3.10 vprintf_s 函数 (p: 598-599)
- K.3.5.3.12 vsnprintf_s 函数 (p: 600)
- K.3.5.3.13 vsprintf_s 函数 (p: 601)
- C99 标准 (ISO/IEC 9899:1999):
- 7.19.6.8 vfprintf 函数 (p: 292)
- 7.19.6.10 vprintf 函数 (p: 293)
- 7.19.6.12 vsnprintf 函数 (p: 294)
- 7.19.6.13 vsprintf 函数 (p: 295)
- C89/C90 标准 (ISO/IEC 9899:1990):
- 4.9.6.7 vfprintf 函数
- 4.9.6.8 vprintf 函数
- 4.9.6.9 vsprintf 函数
另见
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
使用可变参数列表将格式化的宽字符输出打印到stdout、文件流 或缓冲区 (函数) |
(C99)(C11)(C11)(C11)(C11) |
将格式化输出打印到stdout、文件流或缓冲区 (函数) |
(C99)(C99)(C99)(C11)(C11)(C11) |
使用可变参数列表从stdin、文件流或缓冲区读取格式化输入 (函数) 有关 |
vprintf、vfprintf、vsprintf、vsnprintf 的 C++ 文档
| |