Как сделать так, чтобы клавиши со стрелками и backspace работали правильно при запросе ввода от пользователя в C-программе, используя termios.h?
Итак, у меня есть следующий код, который в основном просто читает символы, введенные пользователем, и печатает их до тех пор, пока не будет введено «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.