2013-01-05 65 views
4

我试图获得格式为intwchar_t*作为参数。我谷歌搜索了很多,但我只是结束了更多的困惑。所以,考虑下面的代码:使用wsprintf将int转换为wchar_t *

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_twsprintfwprintf分别是charsprintfprintf宽字符等效,我希望上面的打印[5],但它[]之间的打印无用。什么是达到预期结果的正确方法?我在这里误解了什么?

(我要澄清的是便携性比这里安全更重要,所以我想知道使用这个家庭的功能,而不是更安全的特定供应商的扩展的解决方案。)

+0

你怎么知道它是印刷垃圾?你是否将输出传送到一个文件中并在十六进制编辑器中查看它? –

+0

不,我认为'wprintf'会以预期的方式将它打印到控制台。不知何故,这是不正确的? –

+1

对于我(Mac OS X 10.7.5),'wsprintf()'不可用,但是'swprintf()'按预期打印'[5]'。 – 2013-01-05 15:21:20

回答

5

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

这在我看来,您正在为输出使用不正确的格式说明符。我怀疑你会想

wprintf(L"[%s]\n", buf); 

%LS看起来像符的组合无效 - l对于“长整型”大小上的“字符串”类型说明符前缀。我在wprintf上找到的文档表明它将's'类型说明符视为指向一个宽字符串(至少对于MS Visual Studio)。

+2

'%ls'和'%hs'是有效的[MSVC格式说明符](http://msdn.microsoft.com/en-us/library/windows/desktop/ms647550(v = vs.85).aspx)for宽和“窄”字符串。使用普通的'%s'有点微妙。 – DCoder

2

wsprintf()是微软的混合动力功能之一。它具有不同的签名,具体取决于预处理期间是否定义了_UNICODE。 (什么是引擎盖下发生,是有一个#ifdef,基于该符号的不存在或存在与wsprintfAwsprintfW取代wsprintf

如果_UNICODE定义,它预计缓冲区是wchar_t[]

如果没有定义_UNICODE(通常是默认值),则预计缓冲区为char[]。这就是这里发生的事情。如果您有警告,它可能会显示关于不兼容指针类型的警告。垃圾是因为它存储在buf中的8位ascii被解释为Unicode wprintf()