Почему терминал отображает «^ [[A» «^ [[B» «^ [[C» «^ [[D» при нажатии клавиш со стрелками в Ubuntu?

c
Вопрос:Сначала я написал крошечную программу на Ansi C для Windows и скомпилировал ее в Ubuntu со встроенным GCC. Программа проста: читать строку из консоли с scanf(). Проанализируйте строку и рассчитайте. Но происходит нечто странное. Когда я пытаюсь переместить курсор, он печатает четыре символа: нажатие Up печатает "^[[A" нажатие Dn печатает "^[[B" нажатие Rt печатает "^[[C"

Вопрос:

Сначала я написал крошечную программу на Ansi C для Windows и скомпилировал ее в Ubuntu со встроенным GCC.

Программа проста:

  • читать строку из консоли с scanf().
  • Проанализируйте строку и рассчитайте.

Но происходит нечто странное. Когда я пытаюсь переместить курсор, он печатает четыре символа:

  • нажатие Up печатает “^[[A“
  • нажатие Dn печатает “^[[B“
  • нажатие Rt печатает “^[[C“
  • нажатие Lt печатает “^[[D“

  • Как этого можно избежать?

  • Почему он печатает эти 4 символа вместо перемещения курсора?

Лучший ответ:

Потому что то, что клавиатура фактически отправляет на ПК (точнее, что терминал печатает для того, что он фактически получает с клавиатуры). bash, например, получает эти значения, расшифровывает их и понимает, что вы хотите перемещаться, поэтому он будет либо перемещать курсор (в случае левого/правого), либо использовать его историю для извлечения предыдущих команд (вверх/вниз). Таким образом, вы не можете ожидать, что ваша программа магически поддерживает клавиши со стрелками.

Однако, чтение со стандартного ввода с терминала уже поддерживает клавиши со стрелками влево/вправо (я полагаю, но я не сейчас в Linux, чтобы проверить и убедиться). Поэтому я предполагаю, что есть другая проблема. Одна из возможных причин может заключаться в том, что один из ваших ключей-модификаторов застрял? Возможно, ALT, CTRL или SUPER?

Ответ №1

Для тех, кто идет из osx (mac), попробуйте изменить оболочки на bash

Terminal -> Preferences -> Shells open with -> [select] Command (complete path)

затем вставьте

/bin/bash

Ответ №2

Просто введите $ bash в терминале. Это решит проблему.

Оцените статью
Добавить комментарий