vprintf 函数

每个 vprintf 函数均采用一个指向参数列表的指针,然后将给定数据格式化并写入到特定目标。 函数在几个方面有所不同:在参数验证过程中,函数是采用单字节字符串还是宽字符串、是否具有输出目标以及是否支持在格式字符串中使用的指定顺序参数。

_vcprintf_vcwprintf
vfprintfvfwprintf
_vfprintf_p_vfprintf_p_l_vfwprintf_p_vfwprintf_p_l
vfprintf_s_vfprintf_s_lvfwprintf_s_vfwprintf_s_l
vprintfvwprintf
_vprintf_p_vprintf_p_l_vwprintf_p_vwprintf_p_l
vprintf_s_vprintf_s_lvwprintf_s_vwprintf_s_l
_vscprintf_vscprintf_l_vscwprintf_vscwprintf_l
_vsnprintf_vsnwprintfvsprintfvswprintf
_vsprintf_p_vsprintf_p_l_vswprintf_p_vswprintf_p_l
vsprintf_s_vsprintf_s_lvswprintf_s_vswprintf_s_l

注解

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 具有与 printfformat 自变量相同的形式和函数。 这些函数均不会调用 va_end。 有关每个 vprintf 函数的更完整的说明,请参阅前面表中列出的其对应函数的说明。

_vsnprintfvsprintf 的不同之处在于,它向 buffer 写入的字节数不超过 count 个字节。

名称中带有 w 中缀的这些函数的版本是不带 w 中缀的相应函数的宽字符版本;在其中每个宽字符函数中,bufferformat 是宽字符字符串。 否则,每个宽字符函数的行为会与其 SBCS 对应函数相同。

具有 _s_p 后缀的这些函数的版本是更安全的版本。 这些版本会验证格式字符串。 如果格式字符串格式不正确(例如,使用无效的格式化字符的情况),这些版本会生成异常。

通过这些带有 _p 后缀的函数版本,可以指定所提供的自变量在格式字符串中的替换顺序。 有关详细信息,请参阅 printf_p 位置参数

对于 vsprintfvswprintf_vsnprintf_vsnwprintf,如果在重叠的字符串之间发生复制,则此行为不确定。

重要

确保 format 不是用户定义的字符串。 有关详细信息,请参阅避免缓冲区溢出。 如果使用这些函数的安全版本(__s_p 后缀),如果用户提供的字符串包含无效的格式化字符,则用户提供的格式字符串可能会触发无效参数异常。

另请参阅

流 I/O
fprintf_fprintf_lfwprintf_fwprintf_l
printf_printf_lwprintf_wprintf_l
sprintf_sprintf_lswprintf_swprintf_l__swprintf_l
va_argva_copyva_endva_start