2012-07-08 25 views
5

Mam prostą konfigurację programu ncurses, która czyta znaki po jednym na raz z getch() i kopiuje je do bufora. Problem, który mam, wykrywa naciśnięcie klawisza Backspace. Oto odpowiedni kod:Korzystanie z Backspace z ncurses

while((buffer[i] = c = getch()) != EOF) { 
    ++i; 
    if (c == '\n') { 
     break; 
    } 
    else if (c == KEY_BACKSPACE || c == KEY_DC || c == 127) { 
     i--; 
     delch(); 
     buffer[i] = 0; 
    } 
    refresh(); 
} 

Ale podczas próby uruchomienia tego kodu, to jest to, co pojawia się na ekranie po próbując usunąć znaki z wiersza „To jest test”:

this is a test^?^?^? 

a zawartość buffer są:

this is a test 

z gdb wiem, że jeśli oświadczenie sprawdzania dostępności delete/Backspace jest nazywany, więc co jeszcze powinienem robić tak, że mogę usunąć cha znaki?

+0

Czy "to jest test ^? ^? ^?" Zawartość "bufora", czy jest to, co pojawia się na ekranie? Tak czy inaczej, co jest drugim? –

+0

'to jest test ^? ^? ^?' Jest tym, co pojawia się na terminalu, bufor zawiera 'to jest test'. – Jumhyn

Odpowiedz

4

Wygląda na to, że po wprowadzeniu znaku DEL pojawi się ^?.

Prawdopodobnie możesz dwukrotnie zadzwonić pod numer delch(), ale wtedy musisz dowiedzieć się, które znaki mają postać dwuznakową (lub więcej) sekwencji.

Najlepiej jest zadzwonić pod numer noecho() i samodzielnie wydrukować znaki.

+0

To zadziałało idealnie, to sprawiło, że mój kod również stał się trochę bardziej przejrzysty. Dodatkowo musiałem zmniejszyć "i" o 2, ponieważ zwiększam go przed sprawdzeniem backspace. Dzięki! :) – Jumhyn