对有趣的printf()语句感到困惑

use*_*675 11 c printf

通过阅读此代码,我偶然发现了以下printf()声明:

// reset, hide cursor and clear screen
printf("\e[0m\e[?25l\e[2J");
Run Code Online (Sandbox Code Playgroud)

我必须承认,我不是一名完全合格的C黑客,并且不完全理解这一点.我调整了一下,删除了论点,我理解它的作用(好吧,评论实际上说的都是这样),但我不知道它是如何完成的.此外,这是一个很难谷歌的东西.

这个printf()电话怎么样?

小智 13

这实际上没有任何关系printf.在C11标准列出了转义序列在§5.2.2和清单包括\a,\b,\f,\n,\r,\t\v.作为扩展,GCC认为\e是一个代表ASCII字符的转义序列Esc(\E可能也可以,或者您的编译器可能都不支持它们.请参阅编译器的文档).以下是非便携式控制序列.它们不能保证在所有终端中都能正常工作,甚至根本不能工作.最好的方法是查阅系统文档.

§6.4.4.4也描述了八进制转义序列.例如,\033where 03327十进制,因此是ASCII中的转义字符.同样,您可以使用\x1b,这是一个指定相同字符的十六进制转义序列.

如果我们检查程序的输出od -c,它显示033.

(?´?`) ~/test> ./a.out | od -c
0000000 033   [   0   m 033   [   ?   2   5   l 033   [   2   J
0000016
Run Code Online (Sandbox Code Playgroud)

ANSI转义序列由终端仿真器解释.C将八进制/十六进制转义序列转换为ASCII Esc字符.您的编译器作为扩展,也可以转换\e\E.根据要求,简要说明控制序列正在做什么:

  • [0m:重置所有SGR属性
  • [?25l:隐藏光标
  • [2J:来自维基百科:

    清除部分屏幕.如果n为0(或缺失),则从光标到屏幕结束清除.如果n为1,则从光标到屏幕的开头清除.如果n是2,清除整个屏幕......


ste*_*eha 7

printf()调用只是输出一系列特定的字节值."神奇"是这些值在终端中是特殊的.

以ASCII"escape"字符开头的一系列特殊字节称为"转义序列".这些是为串行数据终端发明的,其中与终端通信的唯一方法是通过串行连接发送字节值.普通字符只是简单地显示在终端上,但是希望有一种移动光标,清除屏幕等方法,并且大多数终端都使用了转义序列.

http://en.wikipedia.org/wiki/Escape_sequence

有一个特别受欢迎的终端称为"VT100",今天大多数终端仿真器使用VT100转义序列.

即使在今天,转义序列也很有用.您可以编写一个简单的C程序,它可以在Linux,Mac,Windows,移动设备上的终端仿真器上运行,基本上无处不在.当你需要做一些像清除屏幕这样简单的事情时,输出正确的转义序列是最简单的方法.