【发布时间】:2017-01-25 04:19:50
【问题描述】:
我正在开发一个需要允许终端交互的 C 程序。我已经尝试了几天来尝试让退格键正常工作。
在我的程序中,我轮询来自终端的输入。当我检测到输入时,我会检查按下的键是否是退格键:
if((letter == 8 || letter == 127) && cursorPosition >= 1)
cursorPosition 保存光标在终端上的当前位置。我执行此检查以确保不允许用户删除我的提示,即>。
然后,一旦检查通过,我使用以下代码将光标移回并删除字符:
serial_print("\033[1D");
serial_print("\033[K");
serial_print 是我定义的一个函数,因为这段代码是我正在使用 qemu 编写和运行的操作系统的一部分。我无权访问 c printf,所以我使用串行端口输入/输出到终端。已知该函数可以正常工作。
基本上,我的思考过程是第一行应该将光标向左移动一列,第二行应该擦除光标右侧的所有内容。
在我在终端的行上输入 3 个或更多字符之前,一切正常。
当我有一个角色时:
1
然后按退格键,我得到:
当输入两个字符时,我也能正常工作。但是,如果我有三个字符:
123
然后按退格键三下,这就是该行的样子:
123
如果我有六个字符:123456
按退格键 6 次后:123456454
我很困惑,因为终端解释转义序列的方式似乎会根据当前行中的字符数而改变。我在我的 Mac 上的 VirtualBox 中运行 Ubuntu 16.04,并使用 qemu 运行我在 Ubuntu 终端中编写的操作系统,如果该信息有任何不同的话。
有人知道是什么原因造成的吗?另外,我仍然在这里掌握窍门,所以如果您需要更多信息或我做错了什么,请告诉我。
【问题讨论】:
-
你的缓冲存储/打印代码是什么?即,您是否可以正确操作屏幕,但不是您的存储缓冲区?
-
如果没有(短)程序证明问题,就没有什么可评论的。