我正在寻找一种方法在关闭程序后“重置”我的Unix终端窗口,并偶然发现了printf("\033c" );
,它完美地解决了这个问题,但我无法理解它。我查阅了man console_codes
,但由于我在Unix C编程方面有些不熟练,所以并没有什么帮助。
请问有人能够解释一下printf("\033c" );
吗?
在C语言中,以前导零开头的数字是八进制数字。即8进制数字。
它所做的是打印由八进制数33
表示的字符,后跟一个'c'
。
在ASCII编码中,八进制数33
是ESC
(转义)字符,这是终端控制序列的常见前缀。
有了这个知识,我们可以搜索终端控制序列,例如这个VT100控制序列参考(VT100是一种旧的“哑终端”,并且被大多数现代终端程序模拟)。使用VT100参考,我们在终端设置部分找到<ESC>c
,其中将其记录为
重置设备
<ESC>c
将所有终端设置重置为默认值。
ESC
字符也可以使用"\x1b"
打印(仍假定ASCII编码)。在常量字符串文字中,只能使用八进制和十六进制,无法使用十进制数字。< / p >
< p > 然而(如 chux 的评论所述),序列"\x1bc"
将不会与"\033c"
相同。这是因为0x1bc
是一个有效的十六进制数,当编译器解析这样的序列时它是贪婪的。它将打印由值0x1bc
表示的字符,我不知道它可能是什么(取决于区域设置和终端设置,可能会作为Unicode字符打印)。< / p >
\033
是ASCII转义字符,它开始这些序列。大多数都后跟另一个特殊字符(这是一个罕见的例外)。XTerm Control Sequences列出了这个以及其他没有后跟特殊字符的字符。[
用于*控制序列启动器。printf("\033[H\033[J");
ncurses常见问题解答为什么重置会使我注销? 解决了这个问题。
顺便提一下,终端模拟器的用户也会混淆终端的其他问题。ncurses常见问题解答如何在VT100中获得颜色? 解决了其中一个问题。
033c
。但是您的方法实际上也可以做到同样的效果,而且没有您指出的可能问题。 - NUGA
"\x1bc"
可能与"\033c"
的结果不同,因为十六进制转义并不明确地限制长度。可以使用"\x1b" "c"
。 - chux - Reinstate Monicaprintf("%cc", 27);
:) - rici