vprintf 函数

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

_vcprintf、_vcwprintf vfprintf、vfwprintf
_vfprintf_p、_vfprintf_p_l、_vfwprintf_p、_vfwprintf_p_l vfprintf_s、_vfprintf_s_l、vfwprintf_s、_vfwprintf_s_l
vprintf、vwprintf _vprintf_p、_vprintf_p_l、_vwprintf_p、_vwprintf_p_l
vprintf_s、_vprintf_s_l、vwprintf_s、_vwprintf_s_l vsprintf、vswprintf
_vsprintf_p、_vsprintf_p_l、_vswprintf_p、_vswprintf_p_l vsprintf_s、_vsprintf_s_l、vswprintf_s、_vswprintf_s_l
_vscprintf、_vscprintf_l、_vscwprintf、_vscwprintf_l _vsnprintf、_vsnwprintf

备注

vprintf 函数类似于下表中列出的其对应函数。 但是,每个 vprintf 函数接受一个指向参数列表的指针,而每个对应函数都接受一个参数列表。

这些函数格式化用于输出到目标的数据,如下所示。

函数 对应函数 输出目标 参数验证 位置参数支持
_vcprintf _cprintf 控制台 检查是否为 NULL。 no
_vcwprintf _cwprintf 控制台 检查是否为 NULL。 no
vfprintf fprintf 检查是否为 NULL。 no
vfprintf_p fprintf_p 检查是否为 NULL 以及格式是否有效。
vfprintf_s fprintf_s 检查是否为 NULL 以及格式是否有效。 no
vfwprintf fwprintf 检查是否为 NULL。 no
vfwprintf_p fwprintf_p 检查是否为 NULL 以及格式是否有效。
vfwprintf_s fwprintf_s 检查是否为 NULL 以及格式是否有效。 no
vprintf printf Stdout 检查是否为 NULL。 no
vprintf_p printf_p Stdout 检查是否为 NULL 以及格式是否有效。
vprintf_s printf_s Stdout 检查是否为 NULL 以及格式是否有效。 no
vwprintf wprintf Stdout 检查是否为 NULL。 no
vwprintf_p wprintf_p Stdout 检查是否为 NULL 以及格式是否有效。
vwprintf_s wprintf_s Stdout 检查是否为 NULL 以及格式是否有效。 no
vsprintf sprintf buffer 指向的内存 检查是否为 NULL。 no
vsprintf_p sprintf_p buffer 指向的内存 检查是否为 NULL 以及格式是否有效。
vsprintf_s sprintf_s buffer 指向的内存 检查是否为 NULL 以及格式是否有效。 no
vswprintf swprintf buffer 指向的内存 检查是否为 NULL。 no
vswprintf_p swprintf_p buffer 指向的内存 检查是否为 NULL 以及格式是否有效。
vswprintf_s swprintf_s buffer 指向的内存 检查是否为 NULL 以及格式是否有效。 no
_vscprintf _vscprintf buffer 指向的内存 检查是否为 NULL。 no
_vscwprintf _vscwprintf buffer 指向的内存 检查是否为 NULL。 no
_vsnprintf _snprintf buffer 指向的内存 检查是否为 NULL。 no
_vsnwprintf _snwprintf buffer 指向的内存 检查是否为 NULL。 no

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 后缀),如果用户提供的字符串包含无效的格式化字符,则用户提供的格式字符串可能会触发无效参数异常。

另请参阅

流 I/O
fprintf、_fprintf_l、fwprintf、_fwprintf_l
printf、_printf_l、wprintf、_wprintf_l
sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
va_arg、va_copy、va_end、va_start