我正在尝试使用wchar_t*
格式化int
作为参数。我谷歌搜索了很多,但我只是更加困惑。所以,请考虑以下代码:
int main(int argc, char** argv) {
wchar_t buf[16];
wsprintf(buf, L"%d", 5);
wprintf(L"[%ls]\n", buf);
system("pause");
return 0;
};
假设wchar_t
,wsprintf
和wprintf
分别是char
,sprintf
和printf
的广义字符,我预计上面打印[5]
,但它在[
和]
之间打印垃圾。达到预期结果的正确方法是什么?我在这里误解了什么?
(我应该澄清一下,可移植性比安全性更重要,所以我想知道一个使用这一系列功能而不是更安全的特定于供应商的扩展的解决方案。)
答案 0 :(得分:6)
wsprintf()
是Windows特有的功能,在Unix上不可用。 (如果它的实现包含一个错误,我不会感到惊讶......)你想要实现的是一个更便携的方式(我尝试了这个稍微修改过的代码片段,它按预期工作):
#include <wchar.h>
#include <stdio.h>
int main(int argc, char **argv)
{
wchar_t buf[16];
swprintf(buf, sizeof(buf) / sizeof(*buf), L"%d", 5);
wprintf(L"[%ls]\n", buf);
return 0;
}
输出:
[5]
答案 1 :(得分:2)
wsprintf()
是Microsoft的混合功能之一。它具有不同的签名,具体取决于在预处理期间是否定义了_UNICODE
。 (发生了什么事情,是否#ifdef
根据该符号的不存在或存在,用wsprintf
或wsprintfA
替换wsprintfW
。)
如果定义了_UNICODE
,则期望缓冲区为wchar_t[]
。
如果未定义_UNICODE
(通常是默认值),则期望缓冲区为char[]
。这就是这里发生的事情。如果您有警告,则可能会显示有关不兼容指针类型的警告。垃圾是因为buf
中存储的8位ascii被wprintf()
解释为Unicode。
答案 2 :(得分:1)
在我看来,您的输出使用了不正确的格式说明符。我怀疑你会想要
wprintf(L"[%s]\n", buf);
%ls看起来像是无效的说明符组合 - 对于s“string”类型说明符的“long int”大小前缀。我在wprintf上找到的文档表明它将's'类型说明符视为指向宽字符串(至少对于MS Visual Studio)。