Wie können Pfeiltasten und die Rücktaste korrekt funktionieren, wenn der Benutzer in einem C-Programm mit termios.h Eingaben anfordert?

So habe ich den folgenden Code, der im Grunde nur Benutzereingaben liest und sie druckt, bis 'q' eingegeben wird.

#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;
}

Zu Beginn der Hauptfunktion schalte ich den kanonischen Modus aus, damit der Benutzer seine Eingaben sehen kann, wenn er sie gibt. Ich schalte auch das Echo aus, damit Sachen wie "^ [[A" nicht auftauchen, wenn ich zum Beispiel die Aufwärtspfeiltaste drücke. Das funktioniert, aber ich kann den Cursor auch in die oberen Zeilen eines Terminalfensters bewegen, und das ist nicht gut. Gibt es eine Möglichkeit, dies zu beheben, damit der Benutzer sich nur innerhalb der aktuellen Zeile bewegen kann?

Ein weiteres Problem ist die Rücktaste. Wenn ich darauf drücke, druckt das Programm ein seltsames Symbol (von dem ich annehme, dass es 0x7f ist), anstatt das Zeichen zu löschen, das an der aktuellen Position des Cursors verbleibt. Ich sollte die Ausgabe der Rücktaste im Programm wahrscheinlich irgendwie handhaben, aber ich weiß nicht, wie ich das machen soll, da es sich um diese seltsame hexadezimale Zahl handelt. Irgendwelche Tipps dazu?

Eine Option, über die ich nachgedacht habe, besteht darin, den kanonischen Modus zu verwenden, damit die Pfeiltasten und die Rücktastenfunktionen automatisch verwendet werden. Der kanonische Modus arbeitet jedoch zeilenweise, sodass der Text erst angezeigt wird, wenn der Benutzer die Eingabetaste drückt. Bisher habe ich noch keine Möglichkeit gefunden, dem Benutzer seine Eingaben während des Tippens anzuzeigen. Ist das überhaupt möglich?

Und bitte keine Flüche oder Readline-Vorschläge. Ich möchte dies mit termios.h tun.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage