Ore*_*ail 91 c language-agnostic printf special-characters backspace
所以我终于通过K&R阅读,并且我在前几页中学到了一些东西,即有一个退格转义字符\b.
所以我去测试它,并且有一些非常奇怪的行为:
#include <stdio.h>
main ()
{
printf("hello worl\b\bd\n");
}
Run Code Online (Sandbox Code Playgroud)
输出是
hello wodl
Run Code Online (Sandbox Code Playgroud)
有谁能解释一下?
T.J*_*der 131
您的结果将根据您所使用的终端或控制台程序类型而有所不同,但是,大多数\b是非破坏性退格.它向后移动光标,但不会删除那里的光标.
因此对于该hello worl部分,代码输出
hello worl
^
...(^显示光标所在的位置)然后输出两个\b字符,将光标向后移动两个位置而不擦除(在终端上):
hello worl
^
请注意,光标现在位于r.然后它输出d,覆盖r并给我们:
hello wodl
^
最后,它输出\n,这是一个非破坏性换行(同样,在大多数终端上,显然包括你的),所以l保持不变,光标移动到下一行的开头.
pmg*_*pmg 120
.......... ^ <= pointer to "print head"
/* part1 */
printf("hello worl");
Run Code Online (Sandbox Code Playgroud)
hello worl
^ <= pointer to "print head"
/* part2 */
printf("\b");
Run Code Online (Sandbox Code Playgroud)
hello worl
^ <= pointer to "print head"
/* part3 */
printf("\b");
Run Code Online (Sandbox Code Playgroud)
hello worl
^ <= pointer to "print head"
/* part4 */
printf("d\n");
Run Code Online (Sandbox Code Playgroud)
hello wodl ^ <= pointer to "print head" on the next line
Pet*_* K. 43
如果你想要一个破坏性的退格,你需要类似的东西
"\b \b"
Run Code Online (Sandbox Code Playgroud)
即退格,空格和另一个退格.
不太难解释......这就像打字hello worl,按两次左箭头键,输入d并按下向下箭头键.
至少,这就是我推断你的终端正在\b和\n代码进行交互的方式.
将输出重定向到文件,我打赌你完全得到了别的东西.虽然您可能需要查看文件的字节才能看到差异.
[编辑]
为了详细说明,这printf会发出一个字节序列:hello worl^H^Hd^J,其中^H是ASCII字符#8,^J是ASCII字符#10.您在屏幕上看到的内容取决于您的终端如何解释这些控制代码.