如何在 C++ 中使用 curses 安全地将 ASCII 整数转换回其关联的 ASCII 字符?



我一直无法为我的问题找到可靠的解决方案,我只是想做的是创建一些函数:

  • 在终端中占据行和列位置。

  • 调用mvinch(window_object , rows, cols(,它返回一个无符号的 int,它对应于终端中该位置的字符。

  • 返回与该无符号 int 关联的 ASCII 字符,有效地将其转换回 char。

下面是我在 c++11 中的代码示例:

char Kmenu::getChrfromW(size_t const y, size_t const x,
bool const save_cursor) const {
size_t curr_y, curr_x;
getyx(_win, curr_y, curr_x);
char ich = mvwinch(_win, y, x);
char ch = ich;
if (save_cursor)
wmove(_win, curr_y, curr_x);
return ch;
}

例如,如果终端中位置 2,3 的字符是字母"a",我希望此函数返回字母"a"。

我尝试了此处描述的解决方案:

在 C 语言中将 ASCII 数字转换为 ASCII 字符

它有效地将整数转换为字符。

不幸的是,我得到的仍然是整数:用充满"W"的屏幕进行测试,我得到整数 119。

curses 函数 mvwinch(( 的手册页描述了返回chtype的函数,编译器将其识别为 unsigned int。

是否有一个内置的curses函数可以直接返回char而不转换为无符号int,或者我可以实现的其他方法?

编辑:ch到ich,如实际代码

chtype包含一个字符以及其他数据。curses.h标头有几个符号,这些符号对于提取这些位很有用。 如果你用A_CHARTEXT遮盖它并将其投射到char,你会得到一个角色:

char c = (char)((A_CHARTEXT) & n);

您的示例不应编译,因为它声明了两次ch。 你可能的意思是:

char Kmenu::getChrfromW(size_t const y, size_t const x,
bool const save_cursor) const {
int curr_y, curr_x;  // size_t is inappropriate...
getyx(_win, curr_y, curr_x);
char ch = (char)((A_CHARTEXT) & mvwinch(_win, y, x));
// char ch = ich;
if (save_cursor)
wmove(_win, curr_y, curr_x);
return ch;
}

mvwinch手册页在"属性"部分中提到了A_CHARTEXT掩码,假设读者熟悉以下内容:

The following bit-masks may  be  AND-ed  with  characters  returned  by
winch.
A_CHARTEXT     Bit-mask to extract character
A_ATTRIBUTES   Bit-mask to extract attributes
A_COLOR        Bit-mask to extract color-pair field information

最新更新