4

我正在尝试使用作为参数的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,我希望上面的内容可以打印,但它会在和之间打印垃圾。达到预期结果的正确方法是什么?我在这里误解了什么?sprintfprintf[5][]

(我应该在这里澄清可移植性比安全性更重要,所以我想知道一个使用这一系列功能而不是更安全的供应商特定扩展的解决方案。)

4

3 回答 3

7

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]
于 2013-01-05T15:46:29.013 回答
3

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

如果_UNICODE已定义,则它期望缓冲区为wchar_t[].

如果_UNICODE未定义(通常是默认值),则它期望缓冲区为char[]. 这就是这里发生的事情。如果您有警告,它可能会显示有关不兼容指针类型的警告。垃圾是因为它存储的 8 位 asciibufwprintf().

于 2015-09-16T13:16:55.433 回答
1

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

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

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

于 2013-01-05T15:39:55.617 回答