每个 vprintf 函数均采用一个指向参数列表的指针,然后将给定数据格式化并写入到特定目标。 函数在几个方面有所不同:在参数验证过程中,函数是采用单字节字符串还是宽字符串、是否具有输出目标以及是否支持在格式字符串中使用的指定顺序参数。
%>
%>
%>
.- .
注解
vprintf 函数类似于下表中列出的其对应函数。 但是,每个 vprintf 函数接受一个指向参数列表的指针,而每个对应函数都接受一个参数列表。
这些函数格式化用于输出到目标的数据,如下所示。
| 函数 | 对应函数 | 输出目标 | 参数验证 | 位置参数支持 |
|---|---|---|---|---|
_vcprintf |
_cprintf |
console | 检查是否为 NULL。 | 否 |
_vcwprintf |
_cwprintf |
console | 检查是否为 NULL。 | 否 |
vfprintf |
fprintf |
stream |
检查是否为 NULL。 | 否 |
vfprintf_p |
fprintf_p |
stream |
检查是否为 NULL 以及格式是否有效。 | 是 |
vfprintf_s |
fprintf_s |
stream |
检查是否为 NULL 以及格式是否有效。 | 否 |
vfwprintf |
fwprintf |
stream |
检查是否为 NULL。 | 否 |
vfwprintf_p |
fwprintf_p |
stream |
检查是否为 NULL 以及格式是否有效。 | 是 |
vfwprintf_s |
fwprintf_s |
stream |
检查是否为 NULL 以及格式是否有效。 | 否 |
vprintf |
printf |
stdout |
检查是否为 NULL。 | 否 |
vprintf_p |
printf_p |
stdout |
检查是否为 NULL 以及格式是否有效。 | 是 |
vprintf_s |
printf_s |
stdout |
检查是否为 NULL 以及格式是否有效。 | 否 |
vwprintf |
wprintf |
stdout |
检查是否为 NULL。 | 否 |
vwprintf_p |
wprintf_p |
stdout |
检查是否为 NULL 以及格式是否有效。 | 是 |
vwprintf_s |
wprintf_s |
stdout |
检查是否为 NULL 以及格式是否有效。 | 否 |
vsprintf |
sprintf |
buffer 指向的内存 |
检查是否为 NULL。 | 否 |
vsprintf_p |
sprintf_p |
buffer 指向的内存 |
检查是否为 NULL 以及格式是否有效。 | 是 |
vsprintf_s |
sprintf_s |
buffer 指向的内存 |
检查是否为 NULL 以及格式是否有效。 | 否 |
vswprintf |
swprintf |
buffer 指向的内存 |
检查是否为 NULL。 | 否 |
vswprintf_p |
swprintf_p |
buffer 指向的内存 |
检查是否为 NULL 以及格式是否有效。 | 是 |
vswprintf_s |
swprintf_s |
buffer 指向的内存 |
检查是否为 NULL 以及格式是否有效。 | 否 |
_vscprintf |
_vscprintf |
buffer 指向的内存 |
检查是否为 NULL。 | 否 |
_vscwprintf |
_vscwprintf |
buffer 指向的内存 |
检查是否为 NULL。 | 否 |
_vsnprintf |
_snprintf |
buffer 指向的内存 |
检查是否为 NULL。 | 否 |
_vsnwprintf |
_snwprintf |
buffer 指向的内存 |
检查是否为 NULL。 | 否 |
argptr 参数的类型为 va_list,它在 VARARGS.H 和 STDARG.H 中定义。 argptr 变量必须由 va_start 初始化,并可由后续的 va_arg 调用重新初始化;然后 argptr 指向根据 format 自变量中的相应规范转换和传输以用于输出的参数列表的开头。 format 具有与 printf 的 format 自变量相同的形式和函数。 这些函数均不会调用 va_end。 有关每个 vprintf 函数的更完整的说明,请参阅前面表中列出的其对应函数的说明。
_vsnprintf 与 vsprintf 的不同之处在于,它向 buffer 写入的字节数不超过 count 个字节。
名称中带有 w 中缀的这些函数的版本是不带 w 中缀的相应函数的宽字符版本;在其中每个宽字符函数中,buffer 和 format 是宽字符字符串。 否则,每个宽字符函数的行为会与其 SBCS 对应函数相同。
具有 _s 和 _p 后缀的这些函数的版本是更安全的版本。 这些版本会验证格式字符串。 如果格式字符串格式不正确(例如,使用无效的格式化字符的情况),这些版本会生成异常。
通过这些带有 _p 后缀的函数版本,可以指定所提供的自变量在格式字符串中的替换顺序。 有关详细信息,请参阅 printf_p 位置参数。
对于 vsprintf、vswprintf、_vsnprintf 和 _vsnwprintf,如果在重叠的字符串之间发生复制,则此行为不确定。
重要
确保 format 不是用户定义的字符串。 有关详细信息,请参阅避免缓冲区溢出。 如果使用这些函数的安全版本(__s 或 _p 后缀),如果用户提供的字符串包含无效的格式化字符,则用户提供的格式字符串可能会触发无效参数异常。