【问题标题】:VT100 Escape Codes to move cursor acting weird from C ProgramVT100 Escape Codes 移动光标在 C 程序中表现怪异
【发布时间】: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 终端中编写的操作系统,如果该信息有任何不同的话。

有人知道是什么原因造成的吗?另外,我仍然在这里掌握窍门,所以如果您需要更多信息或我做错了什么,请告诉我。

【问题讨论】:

  • 你的缓冲存储/打印代码是什么?即,您是否可以正确操作屏幕,但不是您的存储缓冲区?
  • 如果没有(短)程序证明问题,就没有什么可评论的。

标签: c terminal qemu


【解决方案1】:

您可能对“cursorPosition”有疑问。试试这个:

if (letter == 8 || letter == 127) {
    if (cursorPosition >= 1) {
        serial_print("\033[1D");
        serial_print("\033[K");
        --cursorPosition;
    }
} else if (letter >= 32 && letter <= 126) {
    serial_print_char (letter);
    ++cursorPosition;
}

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 2014-09-22
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多