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