所以我有以下代码,它基本上只是读取用户输入的字符并打印它们,直到输入'q'。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<termios.h>
int main(void) {
char c;
static struct termios oldtio, newtio;
tcgetattr(0, &oldtio);
newtio = oldtio;
newtio.c_lflag &= ~ICANON;
newtio.c_lflag &= ~ECHO;
tcsetattr(0, TCSANOW, &newtio);
printf("Give text: ");
fflush(stdout);
while (1) {
read(0, &c, 1);
printf("%c", c);
fflush(stdout);
if (c == 'q') { break; }
}
printf("\n");
tcsetattr(0, TCSANOW, &oldtio);
return 0;
}
在主要功能的开头,我关闭了规范模式,以使用户能够在他给出输入时看到他的输入。我还关闭了回声,例如,当按下向上箭头键时,不会弹出诸如“^[[A”之类的东西。这可行,但我也可以将光标移动到终端窗口的上排,这并不好。有没有办法解决这个问题,使用户只能在当前行内移动?
另一个问题是退格。当我按下它时,程序会打印一个奇怪的符号(我假设它是 0x7f),而不是擦除光标当前位置左侧的字符。我应该以某种方式适当地处理程序中的退格键输出,但我不知道该怎么做,因为它是这个奇怪的十六进制数字。对此有什么建议吗?
我也一直在考虑使这项工作的一个选项是使用规范模式,以便自动使用箭头键和退格功能。但是,规范模式逐行工作,因此在用户点击“Enter”之前不会出现文本。到目前为止,我还没有想出任何方法让用户在打字时看到他的输入。这甚至可能吗?
拜托,没有 ncurses 或 readline 建议。我想使用 termios.h 来做到这一点。