【问题标题】:Getting an unexpected character with addch使用 addch 获得意想不到的角色
【发布时间】:2019-07-03 20:07:01
【问题描述】:

我正在使用带有noecho() 的ncurses,并且我正在尝试使用addch() 函数从TCHAR(或char16_t)数组中打印一个字符串。

我尝试将 TCHAR 转换为 int,但结果相同。

这是我正在使用的代码:

coords hCursorPosition( GetCursorPosition() );
        if ( hCursorPosition.X == 0 ) return;
        coords nCursorPosition(hCursorPosition.Y, 0);
        SetCursorPosition(nCursorPosition);
        clrtoeol();
        if (!m_sInput.IsEmpty())
        {
            for (auto CharIt(m_sInput.CreateConstIterator()); CharIt; CharIt++)
            {
                const TCHAR Char = *CharIt;
                int intChar = static_cast<int>(Char);
                addch(intChar);
                refresh();
            }
        }

m_sInputFString(虚幻引擎 4 中使用的一种类型),我检查了 FString 的长度,它是正确的,但结果不是我所期望的。

例如,如果m_sInput 是“test”,我的输出将是“test^@”

【问题讨论】:

标签: c++ linux ncurses unreal-engine4


【解决方案1】:

addch 需要一个 chtype 参数,该参数包含一个 8 位字符(如果您碰巧将 NUL 传递给它,它将显示为 @987654326 @)。

wchar_t 包含超过 8 位字符。 那个使用addwstr

【讨论】:

  • 感谢您的回答!无论如何,我犯了一个错误:TCHAR 是一个 char16_t,所以在使用 addwstr 时出现了这个编译错误:错误:无法使用“const TCHAR”类型的左值(又名“const char16_t”初始化一个“const char *”类型的参数) ')
  • 解决了用这个替换代码:if (!m_sInput.IsEmpty()) { addstr(TCHAR_TO_ANSI(*m_sInput)); refresh(); }
  • @Scienziatogm TCHAR 是您告诉编译器制作它的任何大小。它旨在将代码从旧的基于 DOS 的操作系统移植到基于 Windows NT 的操作系统。一个 20 年前的问题的 20 年前的解决方案。现在,最好避免使用TCHAR 来防止像这样的有趣惊喜。
  • @user4581301 TCHAR 被虚幻引擎定义为支持广泛的平台,从我在实践中可以看到它总是被定义为wchar_t
  • @Rotem 是的,但是在这种情况下,它被定义为一个 const char16_t
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多