Как сделать так, чтобы клавиши со стрелками и 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.

Ответы на вопрос(2)

Ваш ответ на вопрос