Простой и переносимый метод управления действиями консольных курсоров в Stack Overflow

При работе с консольным вводом (stdin, std :: cin) в C ++ существует переносимый способ управления различными действиями, которые пользователь может выполнять, например:

  1. Backspace / Delete
  2. Элемент списка
  3. Стрелки влево / вправо (перемещение курсора назад / вперед, вставка текста)

Например, в Windows при использовании std :: cin (например, std :: cin >> s;) он позволяет использовать клавиши со стрелками, однако при использовании того же самого кода в linux клавиши со стрелками считаются частью ввода курсор не перемещается.

Я знаю о различных структурах TUI, таких как curses и ncurses, которые предоставляют такую ​​функциональность, однако они больше, чем требуется.

Я надеюсь, что есть простое решение, основанное на стандартных библиотеках, или даже легковесная библиотека с открытым исходным кодом, которая может иметь функцию, подобную std :: getline, которая переносима на более популярные ОС.

1

Решение

Такие вещи, как возврат и удаление, обычно обрабатываются
система; когда вы читаете из терминала, вы получаете только вход
когда пользователь нажимает ввод.

То, что делает система, обычно довольно ограничено. Особенно,
Я не знаю ни одного, что делает такие вещи, как завершение имени файла.
Если требуется больше, чем то, что делает система, я бы порекомендовал
глядя в readline библиотека, используемая многими программами GNU
(bash, gdb и т. д.). Это доступно отдельно от
приложения, которые его используют. (Два небольших предупреждения: я не знаю,
насколько хорошо его поддержка для родной Windows, и я не уверен
под какой лицензией она находится: GPL или LGPL.)

1

Другие решения

Readline хороший выбор для Linux, но это GPL! Я использую следующий код для компиляции в Windows и Linux:

#ifdef USE_READLINE
#include <readline/readline.h>
#include <readline/history.h>
#endif
...
void getline(char *buf)
{
#ifdef USE_READLINE
char *tmp;
tmp = readline(PROMPT);
if(strncmp(tmp, buf, MAXLENGTH)) add_history(tmp);      // only add new content
strncpy(buf, tmp, MAXLENGTH);
buf[MAXLENGTH]='\0';
free(tmp);
#else
std::cout<<PROMPT;
std::cin.get(buf,MAXLENGTH);
std::cin.ignore(); // delete CR
#endif
}
0