Управляющие клавиши (стрелка влево) отправляются на стандартный ввод (^ [[D) вместо интерпретации - PullRequest
2 голосов
/ 09 сентября 2011

При чтении пользовательского ввода с использованием getline (cin, mystrvar) некоторые клавиши управления не работают.

Пример:

User input: abc^[[Dd
Text: abd
User input: asc
Read bytes: 7
#0: 97
#1: 98
#2: 99
#3: 27
#4: 91
#5: 68
#6: 100

Я набрал a, b, c, затем стрелку влево и d. «Текст:», по-видимому, пишет (cout) первые три символа, затем устанавливает указатель влево и перезаписывает символ c. «asc» - это простая функция, которая печатает длину (mystrvar.size ()) и значения ascii.

При вызове "stty -ctlecho" (system (...)) я могу использовать клавишу со стрелкой влево, но она не ограничивается моим вводом (я могу перезаписать "Ввод пользователя:") плюс контрольные коды все еще отправляются в мою программу.

Этого не происходит в Windows - я могу нормально использовать клавиши со стрелками (даже вверх / вниз для истории).

Что здесь не так?

Редактировать : Я в основном использую Fedora 15. Кажется, нет никакой разницы между lxterminal, терминал, xterm, konsole, gnome-терминал (как терминал) или bash, ksh, tcsh (как оболочка).

Ответы [ 4 ]

2 голосов
/ 09 сентября 2011

Как работают эти ключи - это свойство вашего терминала, а не программы на c ++.Программа получает буферизованную строку ввода, и ваш терминал отвечает за сборку этой строки.

1 голос
/ 18 сентября 2011

Хотя это не должно иметь ничего общего с программой (которая получает стандартный ввод), я нашел обходной путь, который требует немного другого поведения программы:

#include <readline/readline.h>
#include <readline/history.h>

string blah()
{
    string str;

    cout << "User input (readline): ";

    char *inp_c = readline(""); //Instead of getline()

    str = (const char *)(inp_c); //Because C strings stink

    //...

    return str;
}

Это работает. Я не мог скомпилировать его на Windows, хотя. ошибка: readline / readline.h: нет такого файла или каталога Очевидно, это не стандартный заголовок, поэтому мне нужно сначала его получить / установить.

Если кто-нибудь знает лучший способ, пожалуйста, дайте мне знать!

0 голосов
/ 09 сентября 2011

ОК, тогда попробуйте еще раз.

Как вы думаете, кто предоставляет вам встроенную функцию редактирования? (возможность вернуться, удалить и т. д. перед нажатием Enter)

Конечно, не ваша программа. Так что это должна быть другая программа. Который из ? Поскольку это не оболочка, скажем, консоль, которую вы используете. Похоже, Windows CMD подсказка предоставляют эту функцию. Консоль Linux также должна предоставлять ее, но она может быть деактивирована или необходим пакет.

Вы говорите, что не используете удаленное соединение. Но какую консоль вы используете? Попробуйте "konsole" (консоль kde) или другие варианты, которые может иметь ваша система.

Если нет программы для интерпретации этих специальных клавиш, они просто добавляются во входной буфер ...

0 голосов
/ 09 сентября 2011

PlasmaHH прав, как эти ключи обрабатываются, зависит от терминала.Но не только: интерпретатор оболочки также играет свою роль.

Так что простое предложение: используйте «bash», который по умолчанию обрабатывает эти ключи (на моем компьютере наконец; -)

Просто запустите "bash" и повторите попытку.

...