如何将 va_list 传递给 wsprintfW()?
Posted
技术标签:
【中文标题】如何将 va_list 传递给 wsprintfW()?【英文标题】:How do I pass va_list to wsprintfW()? 【发布时间】:2021-03-14 18:55:59 【问题描述】:我正在尝试制作一个自定义的类似 printf 的函数,它接受参数、格式化然后显示在 MessageBox 上,但 wsprintfW 无法正常工作,它显示一些汉字,我认为编码在某处搞砸了,但我可以'不知道在哪里。如何解决?
代码:
void panic(const wchar_t *fmt, ...)
wchar_t buffer[1024];
va_list args = NULL;
va_start(args, fmt);
wsprintfW(buffer, fmt, args);
va_end(args);
MessageBoxW(NULL, buffer, L"error", MB_OK | MB_ICONERROR);
ExitProcess(EXIT_FAILURE);
来自:
panic(L"hello, %s!", L"michael");
返回错误:
【问题讨论】:
【参考方案1】:您需要使用wvsprintfW
函数。 (注意函数名中的“v”第二个字母。)
void panic(const wchar_t *fmt, ...)
wchar_t buffer[1024];
va_list args = NULL;
va_start(args, fmt);
wvsprintfW(buffer, fmt, args);
va_end(args);
MessageBoxW(NULL, buffer, L"error", MB_OK | MB_ICONERROR);
ExitProcess(EXIT_FAILURE);
【讨论】:
请注意wvsprintfW()
不对输出buffer
执行边界检查,因此可能会发生溢出。考虑改用_vsnwprintf()
、StringCbVPrintfW()
或StringCchVPrintfW()
。
否则,_vsnwprintf()
至少允许您查询所需的长度,以便 buffer
可以动态分配到正确的长度,允许输出字符串长度超过 1024 个字符。以上是关于如何将 va_list 传递给 wsprintfW()?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 NSString 传递给调用 printf 的函数?