printf("\033c") 是啥意思?

Posted

技术标签:

【中文标题】printf("\\033c") 是啥意思?【英文标题】:What does printf("\033c" ) mean?printf("\033c") 是什么意思? 【发布时间】:2018-05-10 06:24:11 【问题描述】:

我正在寻找一种在关闭程序后“重置”我的 Unix 终端窗口的方法,偶然发现了 printf("\033c" );,它运行良好,但我就是无法理解。我去了man console_codes,由于我对 Unix c 编程有点缺乏经验,所以它不是很有帮助。

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

【问题讨论】:

【参考方案1】:

在 C 中,以零开头的数字是 octal 数字。以 8 为基数的数字。

它的作用是打印由八进制数 33 后跟 'c' 表示的字符。

在ASCII encoding 中,八进制数33ESC(转义)字符,它是终端控制序列的常用前缀。

通过搜索终端控制序列的知识,我们可以找到例如this VT100 control sequence reference(VT100 是一个旧的“哑”终端,大多数现代终端程序都在模仿)。使用 VT100 参考,我们在终端设置部分找到<ESC>c,其中记录为

重置设备<ESC>c

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


ESC 字符也可以使用"\x1b" 打印(仍然假设 ASCII 编码)。没有办法在常量字符串文字中使用十进制数,只能使用八进制和十六进制。

但是(如the comment by chux 所述)序列"\x1bc"不会"\033c" 执行相同的操作。这是因为0x1bc 是一个有效的十六进制数,而编译器在解析此类序列时是贪婪。它将打印由值 0x1bc 表示的字符,我不知道它可能是什么(取决于我想的语言环境和终端设置,可能会打印为 Unicode 字符)。

【讨论】:

嗯,我认为没有更好的答案存在!非常感谢您不仅指导了我一些新的事情,而且还提供了更正确的答案。 次要:"\x1bc" 可能不会给出与"\033c" 相同的结果,因为十六进制转义没有明确的长度限制。可以使用"\x1b" "c" @chux 证明有时经验并不意味着一切。而那个“代码”评论 do 帮助。 :) 十进制数:printf("%cc", 27); :) "并且 printf 函数在读取字符时是贪婪的" 字符转义序列在编译时被解析,而不是通过printf 函数。【参考方案2】:

这是一个用于重置 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 常见问题解答 Why does reset log me out? 解决了这个问题。

顺便说一句,终端仿真器的用户也会对终端的其他问题感到困惑。 ncurses 常见问题解答 How do I get color with VT100? 解决了其中之一。

【讨论】:

感谢您的回复!答案 Some Programmer Dude 提供了终端,在“清除”之后会粘在中间而不是像它应该的那样在左上角,我的强迫症开始了,所以我不得不坚持使用033c。但是您的实际上也是如此,没有您指出的可能问题。【参考方案3】:

它在 Linux 类型的操作系统(ubuntu、fedora 等)中清除屏幕。 你可以在这里查看asciitable.com,在八进制 33(十进制 27)下你有 ESC 字符。

【讨论】:

以上是关于printf("\033c") 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

c语言 多线程套接字编程

until 格式

如何在Linux终端里用Shell和C输出带颜色的文字

C语言中 printf语法printf("%d %d %c\n",a,b,c);和printf("%d %d %c\n",&a,&b,&c);啥

printf("... %c ...",'\0') 和家人 - 会发生啥?

c语言中怎样在输出语句printf中输出双引号