c - 如何通过使用 getchar 按下箭头键来避免阅读奇怪的符号?
问题描述
使用getchar()读取stdin
时,当我按下键盘的任意箭头键时,我会得到奇怪的符号(如:)^[[A
。
#include <stdio.h>
int main(void) {
getchar();
}
我怎样才能避免这种情况并使箭头键像 bash 一样工作?
谢谢阅读 :)。
解决方案
你不能真的让箭头键像这样工作getchar()
。Shell 有自己的行编辑功能。通常在执行程序时,shell 会首先将终端设置为所谓的cooked/canonical 模式。
在规范模式下,所有输入都是行缓冲的,您可以以有限的方式编辑行,用退格键删除等。所有其他字符将按原样回显。因此,箭头键通常会发送多个字节,例如ESC [ A将显示为^[[A
好像 echoing is on。
现在 bash 和其他高级 shell 所做的是它们关闭规范模式,以便它们可以在按下键时立即接收。它们还禁用回显,以便键入的字符不会自动显示。但这使得 bash 本身负责更新光标位置或更新显示的字符等事情。箭头键仍然产生相同的字节序列。实际上,您可以通过在 bash: ESC、[、shift+中快速键入相同的序列来尝试此操作,A并且 bash 认为您按下了向上箭头键。
您可以编写自己的例程来进行行编辑,也可以使用现成的库(例如 libreadline 或 libeditline)进行简单的行编辑,或者使用 curses/ncurses 编写复杂的界面,例如文本编辑器或基于菜单的图形用户界面。
推荐阅读
- django - 带有部分嵌套列表的 Django 查询集
- python - 将 for 循环添加到有效的网络爬虫(Python 和 Beautifulsoup)
- unit-testing - 如何测试 CLI 标志 - 当前因“重新定义标志”而失败
- python - 如何运行一次设置(夹具)然后并行测试
- vue.js - 如何使用 vue-konva 创建视频组件?
- node.js - 找不到命名位置“@app”容器化节点应用程序
- php - 更改基于其他数组的键数组
- android-volley - 为什么在加载模型后实例化适配器时需要使用 notifyDataSetChanged()?
- sql-server - 每年计算不同的人,但只计算一次
- android - Microsoft Cognitive Speaker Recognition API - 注册 - 无效音频 400 错误