C++ C++;Ansi转义码及其';手动执行时的解释
我只是无意中注意到了这一点,代码如下。在下面的代码中C++ C++;Ansi转义码及其';手动执行时的解释,c++,bash,ansi,ansi-escape,C++,Bash,Ansi,Ansi Escape,我只是无意中注意到了这一点,代码如下。在下面的代码中 char teststring[20]; cin.getline(teststring, 20); 当我按下一个向上箭头(我用肌肉内存来检查bash历史记录)时,提示停止,并显示Ansi转义代码(从中获取详细信息)^[[A当我按一个空格键并按enter键时,字符A被删除,它打印了一个不可读的垃圾,而不是^[,但是当我手动键入相同的键或再次复制粘贴(以确保它不是ASCII中类似的符号)而没有最后一个字母时,它打印了^[[。 虽然输入的字符相同
char teststring[20];
cin.getline(teststring, 20);
当我按下一个向上箭头(我用肌肉内存来检查bash历史记录)时,提示停止,并显示Ansi转义代码(从中获取详细信息)^[[A
当我按一个空格键并按enter键时,字符A
被删除,它打印了一个不可读的垃圾,而不是^[
,但是当我手动键入相同的键或再次复制粘贴(以确保它不是ASCII中类似的符号)而没有最后一个字母时,它打印了^[[
。
虽然输入的字符相同,但原因是什么
Unix终端是一个非常复杂的庞然大物。Posix包含了它的一系列功能;下面只是一个简单的总结 通常,终端输入设备在“规范”模式下运行模式。在该模式下,终端驱动程序维护一个行缓冲区,在必要时通过读取用户输入来填充。如果缓冲区被清空,并且程序请求更多数据,则驱动程序将在向程序提供更多数据之前读取整行输入。因此,如果缓冲区为空,即使是
getc
也可以读取单个ch字符将导致在getc
返回之前将整个数据读入终端驱动程序的缓冲区
当驱动程序读取输入字符时,它会检查某些特殊字符;其他任何字符都会添加到行缓冲区并回显到终端设备。(终端设备的输入和输出是独立的;如果驱动程序或程序没有回显输入,屏幕上将不会显示任何内容,这通常会造成混乱。例如,程序关闭回显是为了能够接受密码。)
所有特殊字符都是可配置的。有很多;以下是一些更常见的字符:
- Enter将换行符插入缓冲区,并终止输入行,以便返回挂起的读取
- Ctrl-D(
)字符本身将被丢弃,但输入将终止,并返回挂起的读取。如果输入缓冲区为空,即在行首按Ctrl-D,则将向挂起的读取返回一个零长度缓冲区,该缓冲区将被解释为文件结束标记EOF
- Bksp(
)除非输入缓冲区为空,否则会从输入缓冲区中删除最后一个字符并将其从屏幕中删除ERASE
- Ctrl-C(
)向进程发送INTR
SIGINT
- Ctrl-Z(
)向进程发送SUSP
SIGTSTP
- Ctrl-U(
)删除整个输入缓冲区KILL
- Ctrl-S(
)停止输出STOP
- 如果使用
字符停止了输出,则Ctrl-Q(STOP
)将恢复输出START
ESC
字符的代码为0x1B,因此通常会以插入符号的形式进行回显,后跟字符0x5B,这是一个开放的方括号。因此,您通常希望ESC
以^[
的形式进行回显
键盘上的许多键实际上发送不止一个字符,并且几乎所有这些序列都以ESC[]开头。例如,向上箭头发送代码ESC[A,因此如果您正在运行一个不处理光标移动字符的简单程序,当您按下向上箭头键时,您将看到^[[A
回声
您看到的字符是用于显示与任何Unicode标志符都不对应的字符的方式之一。该框包含四个十六进制数字,对应于Unicode代码点,在本例中为U+001B,这是一个
ESC
字符。我不知道为什么会发生这种情况,但很可能是v之间的竞争条件造成的有助于终端回音的各种组件。我投票结束这个问题,因为它更适合unix.stackexchange.com。