printf("\033c")的意思是什么?

17

我正在寻找一种方法在关闭程序后“重置”我的Unix终端窗口,并偶然发现了printf("\033c" );,它完美地解决了这个问题,但我无法理解它。我查阅了man console_codes,但由于我在Unix C编程方面有些不熟练,所以并没有什么帮助。

请问有人能够解释一下printf("\033c" );吗?

3个回答

26

在C语言中,以前导零开头的数字是八进制数字。即8进制数字。

它所做的是打印由八进制数33表示的字符,后跟一个'c'

ASCII编码中,八进制数33ESC(转义)字符,这是终端控制序列的常见前缀。

有了这个知识,我们可以搜索终端控制序列,例如这个VT100控制序列参考VT100是一种旧的“哑终端”,并且被大多数现代终端程序模拟)。使用VT100参考,我们在终端设置部分找到<ESC>c,其中将其记录为

重置设备 <ESC>c

将所有终端设置重置为默认值。


< p > ESC字符也可以使用"\x1b"打印(仍假定ASCII编码)。在常量字符串文字中,只能使用八进制和十六进制,无法使用十进制数字。< / p > < p > 然而(如 chux 的评论所述),序列"\x1bc"不会"\033c"相同。这是因为0x1bc是一个有效的十六进制数,当编译器解析这样的序列时它是贪婪的。它将打印由值0x1bc表示的字符,我不知道它可能是什么(取决于区域设置和终端设置,可能会作为Unicode字符打印)。< / p >

我认为没有更好的答案了!非常感谢你不仅教给我新知识,还提供了更正确的答案。 - NUGA
4
小问题:"\x1bc" 可能与 "\033c" 的结果不同,因为十六进制转义并不明确地限制长度。可以使用 "\x1b" "c" - chux - Reinstate Monica
@chux 有时候经验也不是万能的,这证明了“代码”审查确实有帮助。 :) - Some programmer dude
1
十进制数:printf("%cc", 27); :) - rici
@rici 嗯,是的,但那不在一个字符串字面值中 :) - Some programmer dude
2
“printf”函数读取字符时是贪婪的,但字符转义序列是在编译时解析的,而不是由“printf”函数解析的。 - user694733

8
这是一种用于重置DEC VT100(或兼容)终端的转义序列。一些终端(如Linux控制台)即使不是真正的VT100,也接受VT100风格的转义序列。 \033是ASCII转义字符,它开始这些序列。大多数都后跟另一个特殊字符(这是一个罕见的例外)。XTerm Control Sequences列出了这个以及其他没有后跟特殊字符的字符。
在ECMA-48中,可以使用不同的字符来处理通常情况,例如[用于*控制序列启动器。
重置真正的VT100(与终端仿真器相比)不仅清除屏幕,如Debian Bug report logs - #60377 "reset" broken for dumb terminals中所述,但终端仿真器的用户倾向于认为这是一种快速清除屏幕的方法。标准方法可能类似于这样:
printf("\033[H\033[J");

ncurses常见问题解答为什么重置会使我注销? 解决了这个问题。

顺便提一下,终端模拟器的用户也会混淆终端的其他问题。ncurses常见问题解答如何在VT100中获得颜色? 解决了其中一个问题。


感谢您的回复!有些程序员提供的终端答案,在“清除”后会停留在中间,而不是像应该的那样停留在左上角,我的强迫症发作了,所以我必须坚持使用033c。但是您的方法实际上也可以做到同样的效果,而且没有您指出的可能问题。 - NUGA

3

这条命令可以在Linux操作系统(如Ubuntu、Fedora等)中清除屏幕。您可以在asciitable.com上查看,八进制33(十进制27)下有一个ESC字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接