为什么终端在Ubuntu中按下箭头键时显示"^ [[A""^ [[B""^ [[C""^ [[D"]?

Kev*_*ong 42 c ubuntu

我首先在Windows上用Ansi C编写了一个小程序,然后我在Ubuntu上用内置的GCC编译它.

该计划很简单:

  • 从控制台读取行scanf().
  • 分析字符串并计算.

但奇怪的事情发生了.当我尝试移动光标时,它会打印四个字符:

  • 按下Up打印"^ [[A"
  • 按下Dn打印"^ [[B"
  • 按下Rt打印"^ [[C"
  • 按下Lt打印"^ [[D"

  • 如何避免这种情况?

  • 为什么打印这4个字符而不是移动光标?

Sha*_*baz 22

因为这就是键盘实际发送到PC的内容(更准确地说,终端打印的是它实际从键盘接收的内容).bash例如获取这些值,解密他们明白,要走动,所以它会将光标移动(在的情况下,左/右),或使用其历史来获取先前的命令(上行/下行).所以你不能指望你的程序神奇地支持箭头键.

但是,从终端的标准输入读取已经支持左/右箭头键(我相信,但我现在不在Linux中测试并确保).所以我猜测还有另一个问题在干扰.一个可能的原因可能是你的一个修饰键被卡住了?也许ALT,CTRL或SUPER?

  • 实际上,问题似乎出在“终端的模式”上:终端有不同的模式,例如直接将每个字符发送到进程,或者聚合一行直到用户按下Enter,或者使用历史滚动显示内容。而不是`vim'风格的全屏模式。发生了很多事情,而且我现在没有时间查找详细信息(这就是为什么我自己不发布答案的原因)。无论如何,当您看到`^ [[A“出现在屏幕上时,这就是发送的转义序列来表示向上箭头,而没有任何解释。 (3认同)
  • 当我按下终端中的箭头键时,它会移动光标,但是当用scanf()从缓冲区读取输入时,它不能. (2认同)

Kha*_*edP 13

对于那些来自osx(mac)的人,请尝试将shell更改为 bash

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

然后粘贴

/bin/bash


Sum*_*h08 13

这可能是因为用户帐户是在 shell 中创建的。您可以通过两种方式将其更改为 bash。

永久解决方案是 -

sudo chsh -s /bin/bash ${username}
Run Code Online (Sandbox Code Playgroud)

要使此解决方案起作用,您必须注销并登录

临时解决方案是每次登录 ubuntu 服务器类型bash并按回车键。


小智 9

如果它位于 docker 容器下,请运行/bin/bash. 这帮助我解决了问题。