Во многих программах разработчики для организации редактируемого ввода используют готовую библиотеку Readline или её аналоги. Она кроме перемещения курсора умеет даже выполнять автодополнение вводимого текста.
Работает эта библиотека следующим образом.
Терминал — программа, которая отвечает за отображение информации и её ввод, — может не только принимать текст от программы, который нужно отобразить, но и специальные коды. Фактически, терминал — это управляемая «прослойка» между программой и клавиатурой/экраном.
Например, код \n
переводит курсор в следующую строку, а \r
перемещает в начало строки (не стирая её). Существуют и другие коды. С их помощью можно не только перемещать курсор, но и, например, менять цвет текста. (Более полный список кодов на английском., посмотрите также man console_codes
) Эти коды стандартизированы и будут более-менее одинаково работать на разных терминалах.
Скажем, команда
printf("AB\033[1DCD\n");
выведет на экран
ACD
так как после символа B
стоит управляющая последовательность \033[1D
, смещающая курсор на одну позицию влево. Следующие символы (CD
) будут печататься уже «поверх» буквы B
.
Терминал может работать в разных режимах. В так называемом каноническом режиме вводимые данные обрабатываются как последовательность строк. Данные передаются программе только когда будет нажата клавиша Enter, а до тех пор вводом управляет сам терминал. В неканоническом режиме программа получает больший контроль над вводом и выводом, так как терминал уже не занимается вводом и выводом и передаёт каждый символ программе. Она в свою очередь может анализировать, какая клавиша была нажата и выводить текст, перемещать курсор, выполнять какие-то ещё действия.
Как именно управлять терминалом, как организовать управление — очень обширная тема для одного вопроса. Подробности вы можете найти, например, в книге Стивенса и Раго «UNIX. Профессиональное программирование».