通过阅读此代码,我偶然发现了以下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 033是27十进制,因此是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,清除整个屏幕......
该printf()调用只是输出一系列特定的字节值."神奇"是这些值在终端中是特殊的.
以ASCII"escape"字符开头的一系列特殊字节称为"转义序列".这些是为串行数据终端发明的,其中与终端通信的唯一方法是通过串行连接发送字节值.普通字符只是简单地显示在终端上,但是希望有一种移动光标,清除屏幕等方法,并且大多数终端都使用了转义序列.
http://en.wikipedia.org/wiki/Escape_sequence
有一个特别受欢迎的终端称为"VT100",今天大多数终端仿真器使用VT100转义序列.
即使在今天,转义序列也很有用.您可以编写一个简单的C程序,它可以在Linux,Mac,Windows,移动设备上的终端仿真器上运行,基本上无处不在.当你需要做一些像清除屏幕这样简单的事情时,输出正确的转义序列是最简单的方法.
| 归档时间: |
|
| 查看次数: |
897 次 |
| 最近记录: |