【问题标题】:WriteConsole() weird characters?WriteConsole() 奇怪的字符?
【发布时间】:2009-07-07 12:33:54
【问题描述】:

我使用这个 sn-p 从 dll 中创建控制台。该 dll 在游戏中加载。

CODE SNIPPET

控制台窗口创建良好。但是当我给它写东西时,我只会得到像“???D??”这样的东西。

我知道我必须使用 printf() 语法。所以我用

wprintf("%s", "test");

任何指针?

【问题讨论】:

    标签: c++ windows console


    【解决方案1】:

    尝试使用:

    wprintf(L"%s", "test");
    

    因为 wprintf 将宽字符串作为输入

    编辑:基于 %s 和 %S 的行为在 wprintf 中使用时会发生变化的事实:

    wprintf("%s", L"test");
    

    wprintf 中的 %s 期望 L"test" 是一个宽字符串。
    我删除了格式参数上的“L”,因为 wprintf 被定义为:

    int wprintf(char *fmt, ...)
    

    【讨论】:

    • 'void wprintf(char *,...)':无法将参数 1 从 'const wchar_t [18]' 转换为 'char *'
    【解决方案2】:

    您正在调用 wprintf(),它是 printf() 例程的“宽字符”版本。这些“宽字符”函数有一个令人讨厌的问题,即“%s”的含义发生了变化:

    printf() - "%s" 表示参数是一个普通字符串,"%S" 表示它是一个宽字符串

    wprintf() - "%s" 表示参数是一个宽字符串,"%S" 表示它是一个普通字符串

    所以你对 wprintf() 的调用告诉它参数是一个宽字符串,但它不是:将其更改为

    printf("%s", "test");
    

    【讨论】:

    • 我怀疑 %s 和 %S 的含义会根据调用的函数而改变。函数之间的区别在于 wprintf 将格式作为一个宽字符串,而 printf 将一个普通字符串。
    • 至少在 Windows 上(这就是我们在这里谈论的),它确实:见 msdn.microsoft.com/en-us/library/hf4y5e3w%28VS.100%29.aspx
    • 这样做很容易编译相同代码的 ansi 和 unicode 版本:Tversionofprint(_T("format %s code"),_T("parameter"));
    【解决方案3】:

    一个好习惯是使用可移植宏 _T(),当我们使用 ASCII 时它什么都不做,而当定义 UNICODE 时,它会在所有字符串前面加上 L。并且使用 _t 前置函数,它们实际上只是在我们使用 ASCII 时映射到普通函数的宏,而在定义 UNICODE 时映射到 w 前置函数。这样一来,您始终拥有可移植的代码 - 可在两个版本中使用:

    _tprintf(_T("%s"),_T("test");
    

    【讨论】:

      【解决方案4】:

      “%s”格式字符串告诉 wprintf 它应该将第一个参数解释为宽字符串。

      为避免这些混合编码问题,您可以使用 TCHAR 宏:

      LPCTSTR pName = _T("World");
      _tprintf( _T("%s, %s"), _T("Hello"), pName );
      

      【讨论】:

        【解决方案5】:

        您的编码错误,因为您使用的是 wstring 字符,但可能只有一个 ascii 控制台。确保您在控制台中使用 unicode 字体。

        【讨论】:

        • 啊,我不需要 unicode 支持,所以我把它重写为 ansi 函数。
        • 他没有使用 wstring 字符作为 wprintf 参数。
        猜你喜欢
        • 2020-05-12
        • 2014-04-09
        • 1970-01-01
        • 2015-07-13
        • 2014-10-03
        • 2010-09-05
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多