gpt4 book ai didi

c - VT100 转义码从 C 程序中移动光标,行为怪异

转载 作者:行者123 更新时间:2023-11-30 16:51:15 25 4
gpt4 key购买 nike

我正在开发一个需要允许终端交互的 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 终端中编写的操作系统(如果该信息有任何区别的话)。

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

最佳答案

您可能遇到“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;
}

关于c - VT100 转义码从 C 程序中移动光标,行为怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41843318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com