首页 > 解决方案 > 如何通过使用 getchar 按下箭头键来避免阅读奇怪的符号?

问题描述

使用getchar()读取stdin时,当我按下键盘的任意箭头键时,我会得到奇怪的符号(如:)^[[A

#include <stdio.h>

int main(void) {
    getchar();
}

我怎样才能避免这种情况并使箭头键像 bash 一样工作?

谢谢阅读 :)。

标签: c

解决方案


你不能真的让箭头键像这样工作getchar()。Shell 有自己的行编辑功能。通常在执行程序时,shell 会首先将终端设置为所谓的cooked/canonical 模式

在规范模式下,所有输入都是行缓冲的,您可以以有限的方式编辑行,用退格键删除等。所有其他字符将按原样显。因此,箭头键通常会发送多个字节,例如ESC [ A将显示为^[[A 好像 echoing is on

现在 bash 和其他高级 shell 所做的是它们关闭规范模式,以便它们可以在按下键时立即接收。它们还禁用显,以便键入的字符不会自动显示。但这使得 bash 本身负责更新光标位置或更新显示的字符等事情。箭头键仍然产生相同的字节序列。实际上,您可以通过在 bash: ESC[shift+中快速键入相同的序列来尝试此操作,A并且 bash 认为您按下了向上箭头键。

您可以编写自己的例程来进行行编辑,也可以使用现成的库(例如 libreadline 或 libeditline)进行简单的行编辑,或者使用 curses/ncurses 编写复杂的界面,例如文本编辑器或基于菜单的图形用户界面。


推荐阅读