Si echo
est sur avant l'appel getch
, ncurses peut renvoyer un retour arrière ASCII, par exemple, 8 (identique à \b
). Cela est mentionné dans la source-code comme une caractéristique de compatibilité Solaris:
/*
* If echo() is in effect, display the printable version of the
* key on the screen. Carriage return and backspace are treated
* specially by Solaris curses:
*
* If carriage return is defined as a function key in the
* terminfo, e.g., kent, then Solaris may return either ^J (or ^M
* if nonl() is set) or KEY_ENTER depending on the echo() mode.
* We echo before translating carriage return based on nonl(),
* since the visual result simply moves the cursor to column 0.
*
* Backspace is a different matter. Solaris curses does not
* translate it to KEY_BACKSPACE if kbs=^H. This does not depend
* on the stty modes, but appears to be a hardcoded special case.
* This is a difference from ncurses, which uses the terminfo entry.
* However, we provide the same visual result as Solaris, moving the
* cursor to the left.
*/
if (sp->_echo && !(win->_flags & _ISPAD)) {
chtype backup = (chtype) ((ch == KEY_BACKSPACE) ? '\b' : ch);
if (backup < KEY_MIN)
wechochar(win, backup);
}
Une autre possibilité est que la description terminal (terminfo) ne peut pas d'accord avec les paramètres du terminal réels (stty). Dans ce cas, ncurses retournera quelle que soit la clé à envoyer (que ce soit ASCII DEL/127 ou BS/8 dépend du système que vous utilisez).
Avez-vous appelé 'keypad (stdscr, TRUE)'? –
oui je l'ai appelé – user8005084
Est-ce que ch est déclaré comme un 'int'? –