Curses не интерпретирует клавиши со стрелками для ввода.Единственное, что вы получаете, это то, что KEY_LEFT служит клавишей возврата, когда установлен режим клавиатуры.Но, к счастью, это не так уж сложно написать свою собственную замену gettr.Для меня работает следующее:
#include <ctype.h>
#include <string.h>
#include <ncurses.h>
static void
readline(char *buffer, int buflen)
/* Read up to buflen-1 characters into `buffer`.
* A terminating '\0' character is added after the input. */
{
int old_curs = curs_set(1);
int pos = 0;
int len = 0;
int x, y;
getyx(stdscr, y, x);
for (;;) {
int c;
buffer[len] = ' ';
mvaddnstr(y, x, buffer, len+1);
move(y, x+pos);
c = getch();
if (c == KEY_ENTER || c == '\n' || c == '\r') {
break;
} else if (isprint(c)) {
if (pos < buflen-1) {
memmove(buffer+pos+1, buffer+pos, len-pos);
buffer[pos++] = c;
len += 1;
} else {
beep();
}
} else if (c == KEY_LEFT) {
if (pos > 0) pos -= 1; else beep();
} else if (c == KEY_RIGHT) {
if (pos < len) pos += 1; else beep();
} else if (c == KEY_BACKSPACE) {
if (pos > 0) {
memmove(buffer+pos-1, buffer+pos, len-pos);
pos -= 1;
len -= 1;
} else {
beep();
}
} else if (c == KEY_DC) {
if (pos < len) {
memmove(buffer+pos, buffer+pos+1, len-pos-1);
len -= 1;
} else {
beep();
}
} else {
beep();
}
}
buffer[len] = '\0';
if (old_curs != ERR) curs_set(old_curs);
}
Чтобы это работало, вам нужно включить перемещение клавиатуры и режим cbreak, а также отключить режим эха:
cbreak();
noecho();
keypad(stdscr, TRUE);
Надеюсь, это поможет
Йохен