vfwprintf
vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s
在标题中定义 | |
---|---|
int vwprintf( const wchar_t *format, va_list vlist | (since C95) |
int vwprintf( const wchar_t *restrict format, va_list vlist | (until C99) |
int vfwprintf( FILE* stream, const wchar_t *format, va_list vlist | (since C99) |
int vfwprintf( FILE *restrict stream, const wchar_t *restrict format, va_list vlist | (since C95) (until C99) |
int vswprintf( wchar_t *buffer, size_t bufsz, const wchar_t *format, va_list vlist | (since C99) |
int vswprintf( wchar_t *restrict buffer, size_t bufsz, const wchar_t *restrict format, va_list vlist | (since C95) (until C99) |
int vwprintf_s( const wchar_t *restrict format, va_list vlist | (since C99) |
int vfwprintf_s( FILE * restrict stream, const wchar_t *restrict format, va_list vlist | (since C11) |
int vswprintf_s( wchar_t *restrict buffer, rsize_t bufsz, const wchar_t * restrict format, va_list vlist | (since C11) |
int vsnwprintf_s( wchar_t *restrict buffer, rsize_t bufsz, const wchar_t *restrict format, va_list vlist | (since C11) |
加载来自定义位置的数据vlist
,将它们转换为宽字符串,并将结果写入各种接收器。
1)将结果写入stdout
。
2)将结果写入文件流stream
。
3)将结果写入一个宽字符串buffer
。最bufsz-1
宽字符后面跟着空宽字符。生成的宽字符串将以空宽字符结尾,除非bufsz
为零。
4-7)与(1-3)相同,只是在运行时检测到以下错误并调用当前安装的约束处理函数:
- 转换说明符
%n
存在于format
8)与(7)相同,除了它会截断结果以适应s所指向的数组。由于所有的边界检查功能,vwprintf_s,vfwprintf_s,vswprintf_s,和vsnwprintf_s仅保证可供如果__STDC_LIB_EXT1__由实现所定义,并且如果用户定义__STDC_WANT_LIB_EXT1__的整数常数1,包括之前<wchar.h>。
参数
参数
返回值
1-3)如果发生错误,则成功写入宽字符数或写入宽字符数。
4)如果发生错误,则成功写入宽字符数或写入宽字符数。如果由于bufsz
限制而导致结果字符串被截断,则函数将返回如果未强加限制,则会写入的字符总数(不包括终止空宽字符)。
5,6)传输到输出流的宽字符数,如果发生输出错误,运行时约束违规错误或编码错误,则输出负值。
7)写入的宽字符数buffer
,不包括空宽字符(只要buffer
不是空指针,bufsz
且不为零且不大于RSIZE_MAX/sizeof(wchar_t)
),则为空宽字符,或者在运行时约束违规时为零,并且编码为负值错误
8)不包括终止空字符的宽字符数(只要buffer
不是空指针bufsz
且不为零且不大于RSIZE_MAX/sizeof(wchar_t)
),buffer
如果bufsz
被忽略,则写入的宽字符数或负值if发生运行时约束违规或编码错误
注意
所有这些函数va_arg
至少调用一次,arg
返回后的值是不确定的。这些函数不会调用va_end
,并且它必须由调用者完成。
虽然窄字符串提供了vsnprintf
,这使得可以确定所需的输出缓冲区大小,但对于宽字符串没有等效(直到C11的vsnwprintf_s),并且为了确定缓冲区大小,程序可能需要调用vswprintf
,检查结果值,并重新分配一个更大的缓冲区,再次尝试直到成功。
vsnwprintf_s
不同vswprintf_s
,将截断结果以适应指向的数组buffer
,即使截断被大多数边界检查函数视为错误。
例
#include <stdio.h>
#include <time.h>
#include <locale.h>
void debug_wlog(const wchar_t *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 args;
va_start(args, fmt
wchar_t buf[1000];
int rc2 = vswprintf(buf, sizeof buf / sizeof *buf, fmt, args
va_end(args
if(rc2 > 0)
wprintf(L"%s [debug]: %ls\n", time_buf, buf
else
wprintf(L"%s [debug]: (string too long)\n", time_buf
}
int main(void)
{
setlocale(LC_ALL, ""
debug_wlog(L"Logging, %d, %d, %d", 1, 2, 3
}
可能的输出:
02/20/15 22:12:38.476575 UTC [debug]: Logging, 1, 2, 3