【发布时间】:2019-08-08 12:29:03
【问题描述】:
我正在编写 Linux 控制台应用程序(某种菜单),因此我需要从用户那里获得输入。这是我目前使用的代码:
int getch(void)
{
int ch;
struct termios oldt;
struct termios newt;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= static_cast<unsigned int>(~(ICANON | ECHO));
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
#define KEY_UP 65
#define KEY_DOWN 66
#define KEY_ESC 27
while(true)
{
ch = getch();
switch(ch)
{
case KEY_UP:
break;
case KEY_DOWN:
break;
case ESC:
break;
}
}
在我需要使用 ESC 之前一切都很好。突然发现 getch() 有时会在循环中返回几个整数。例如:
KEY_UP: 27 91 65
KEY_DOWN: 27 91 66
BKSPACE: 127
ESC: 27
好的,在我的情况下,在循环中进行 3 次迭代后,我将获得正确的值(例如 65 表示 KEY_UP),但是当我真正单击 Esc 按钮时,如何获得 ESC? 如何配置 getch() 以仅返回实际值并避免 esc 序列?
Ubuntu 18.04 gcc 7.4.0 libstdc++.so.6
【问题讨论】:
-
65 是 not 'KEY_UP 的正确值'。它与字母 'A' 相同(ASCII 0x41 = 65 十进制)
-
键盘可以包含比 7 位整数中的数字更多的键(这是很久以前的“标准”)。因此有些键需要使用多个数字来区分自己。不然怎么办?向上键的
65与字母'A'的数字65不同(假设为ASCII)? -
没错!我知道 65 不是正确的键。我只是将它与 getch() 输出兼容。但是如何区分 Up 键(从 27 开始)和真正的 Esc 键(也从 27 开始)?
-
没有区别。了解转义的唯一方法是转义后是否有有效的转义序列。
标签: c++ console-application getchar