Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;Ansi转义码及其';手动执行时的解释_C++_Bash_Ansi_Ansi Escape - Fatal编程技术网

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(
    EOF
    )字符本身将被丢弃,但输入将终止,并返回挂起的读取。如果输入缓冲区为空,即在行首按Ctrl-D,则将向挂起的读取返回一个零长度缓冲区,该缓冲区将被解释为文件结束标记
  • Bksp(
    ERASE
    )除非输入缓冲区为空,否则会从输入缓冲区中删除最后一个字符并将其从屏幕中删除
  • Ctrl-C(
    INTR
    )向进程发送
    SIGINT
  • Ctrl-Z(
    SUSP
    )向进程发送
    SIGTSTP
  • Ctrl-U(
    KILL
    )删除整个输入缓冲区
  • Ctrl-S(
    STOP
    )停止输出
  • 如果使用
    STOP
    字符停止了输出,则Ctrl-Q(
    START
    )将恢复输出
当Linux终端驱动程序回送字符时,它通常会回送控制字符(ascii代码小于0x20的字符)作为插入符号(^)后跟代码高出0x40的字符,通常是一个字母。
ESC
字符的代码为0x1B,因此通常会以插入符号的形式进行回显,后跟字符0x5B,这是一个开放的方括号。因此,您通常希望
ESC
^[
的形式进行回显

键盘上的许多键实际上发送不止一个字符,并且几乎所有这些序列都以ESC[]开头。例如,向上箭头发送代码ESC[A,因此如果您正在运行一个不处理光标移动字符的简单程序,当您按下向上箭头键时,您将看到
^[[A
回声


您看到的字符是用于显示与任何Unicode标志符都不对应的字符的方式之一。该框包含四个十六进制数字,对应于Unicode代码点,在本例中为U+001B,这是一个
ESC
字符。我不知道为什么会发生这种情况,但很可能是v之间的竞争条件造成的有助于终端回音的各种组件。

我投票结束这个问题,因为它更适合unix.stackexchange.com。