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 中,八进制数33
是ESC
(转义)字符,它是终端控制序列的常用前缀。
通过搜索终端控制序列的知识,我们可以找到例如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语言中 printf语法printf("%d %d %c\n",a,b,c);和printf("%d %d %c\n",&a,&b,&c);啥