c - getch(ncurses)返回值在程序之间如何不同?

标签 c gcc ncurses getch

我通过创建一个测试程序开始使用 ncurses,这样我就可以映射我期望从函数中得到的输入,并使用函数指针实现一个控件。然而,在获得我需要的数据后,具有上述控制结构的程序没有按预期响应。我注意到的第一个问题是,当使用箭头键时,程序会在每次按下后显示文本。我注意到的第二个问题是我自己的调试打印输出中显示的值表明 getch 的值在第二个程序中与第一个程序不同。

这两个程序具有相同的初始化函数和相同的参数,顺序相同,并且在同一台机器上,所以没有理由输出和行为应该不同。

有谁知道为什么会这样?

编辑: 该系统运行在 Linux Mint 16 x86_64 架构上。我使用 eclipse 使用 gcc 进行编译。 libncurses 是项目中唯一包含的库。

这是测试代码:

int main()
{
 int i = 0;
 initscr();
 raw();
 keypad( stdscr, TRUE );
 noecho();
 while( 1 ) // need to catch all available keys
 {
  i = getch();

  mvprintw( 0, 0, "%d    ", i );

 }

 getch();
 endwin();
 return 0;

}

当按下向上键时,输出为:“259”

另一个在不同文件中具有相同代码的程序给出了这个输出:“got 27 OA”并在每次再次按下向上键时添加“^[OA”,就好像它在配置为不回显时一样。

我创建了另一个测试程序,但我的简化尚未重现该行为。

我删除了部分代码,其中包含计划在按回车键时调用的此函数导致/发现更改。目前,该函数与输入无关,但似乎仍在影响程序对输入的解释。

void select( int n, Point *p )
{
 if( 16 == p->Y )
  phase = SETUP;

 else if( 18 == p->Y )
  ;

 else
  phase = QUIT;

}

最佳答案

快速实验:

#include <stdio.h>
#include <curses.h>
int main(void) {
   printf("KEY_UP = %d\n", (int)KEY_UP);
}

表示 259KEY_UP 的值,getch() 通常在读取向上箭头时返回的值(因为该 key 没有单一的 ASCII 码,甚至没有 Unicode 码)。

至少在 xterm 中,方向键有两组不同的代码序列。向上箭头键通常发送序列 ^[[A,其中 ^[ 是 Escape 键。但是当我在 xterm 的中键菜单中启用“Application Cursor Keys”时,向上箭头键反而发送 ^[OA,这与 27 OA 是一致的看见。

因此,如果 getch() 看到 ^[[A 序列,它会将其识别为向上箭头键并返回 KEY_UP。但它不识别 ^[OA,所以它只是将它作为 3 个不同字符的序列返回。 (getch() 识别的序列由终端类型的 terminfo 条目控制,具体取决于 $TERM 的值。)

了解如何在您的终端模拟器中禁用“应用程序光标键”;这应该可以解决问题。

关于c - getch(ncurses)返回值在程序之间如何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22213084/

相关文章:

c - 在 Solaris 中编译行计数程序时,与 MacOSX 相比多了三行

c - 在 C 函数中延迟创建自动变量

c - 如何使用 mvinch 获取文本的颜色编号和颜色背景

c++ - 如何更改 Qt Creator 中的默认编译器标志

c - 如何在循环中使用 getch() (nCurses)

linux - 我如何确定一个库(比如说 "cursesw")是否是与 unix/linux 版本一起标准分发的

c++ - 从日志消息中删除静态文本并仅保存变量

c - 定义宏时使用逗号运算符

c++ - 如何在 GCC 中启用反斜杠支持?

windows - 如何让 win32 控制台识别 ANSI/VT100 转义序列?