【问题标题】:Can't print char* in WCHAR* with swprintf无法使用 swprintf 在 WCHAR* 中打印 char*
【发布时间】:2020-09-02 02:42:39
【问题描述】:

我有那个可以工作的功能(我只需要在最后将 wstring 转换为 WHAR*):

wstring stringtowstring(string str)
{
    WCHAR ch[256];
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, (LPWSTR)ch, 256);

    return wstring(ch);
}

但我想知道为什么不这样做:

WCHAR tmp[256];
swprintf(tmp, L"%s", "test");

【问题讨论】:

    标签: c++ wchar


    【解决方案1】:

    假设 Visual Studio 在上下文中,这是 documented non-standard behavior 的 swprintf。

    使用指定的字符和字符串参数 c 和 s 被 printf 系列函数解释为 char 和 char* ,或作为 wprintf家族的wchar_t和wchar_t* 函数。使用 C 和 S 指定的字符和字符串参数被 printf 系列函数解释为 wchar_t 和 wchar_t*,或者被 wprintf 系列函数解释为 char 和 char*。此行为是 Microsoft 特有的。

    Microsoft 特定: Z 类型字符以及 c、C、s 和 S 类型字符与 printf 和 wprintf 函数一起使用时的行为是 Microsoft 扩展时间>。 在所有格式化函数中,ISO C 标准一致地将 c 和 s 用于窄字符和字符串,而 C 和 S 用于宽字符和字符串。

    【讨论】:

    • 我必须用S,就这样?
    • @Entretoize "%S" 或 "%hs" 都适用于 VC++。不幸的是,standard(或便携式)也不是。
    猜你喜欢
    • 2023-03-29
    • 2015-03-11
    • 2012-04-03
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2014-11-22
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多