所以我最后通读了 绑架勒索,在前几页我学到了一些东西,有一个退格转义字符,\b。
\b
所以我去测试它,有一些非常奇怪的行为:
#include <stdio.h> main () { printf("hello worl\b\bd\n"); }
输出是
hello wodl
有人能解释一下吗?
不太难解释... 这就像输入 hello worl,按两次左箭头键,输入 d,然后按下箭头键。
hello worl
d
至少,这就是我如何推断你的终端是解码 \b和 \n的代码。
\n
Redirect the output to a file and I bet you get something else entirely. Although you may have to look at the file's bytes to see the difference.
[编辑]
详细说明一下,这个 printf发出一个字节序列: hello worl^H^Hd^J,其中 ^H是 ASCII 字符 # 8,^J是 ASCII 字符 # 10。您在屏幕上看到的内容取决于您的终端如何解释这些控制代码。
printf
hello worl^H^Hd^J
^H
^J
您的结果将取决于什么类型的终端或控制台程序,但是,是的,在大多数 \b是一个 nondestructive退格。它将光标向后移动,但不会擦除那里的内容。
因此,对于 hello worl部分,代码输出
hello worl ^
... (其中 ^显示光标在哪里)然后输出两个 \b字符将光标向后移动两个地方 without擦除(在您的终端上) :
^
注意光标现在在 r上。然后它输出 d,它覆盖了 r并给我们:
r
hello wodl ^
最后,它输出 \n,这是一个非破坏性的换行符(同样,在大多数终端上,显然包括你的) ,所以 l保持不变,光标移动到下一行的开头。
l
.......... ^ <= pointer to "print head"
/* part1 */ printf("hello worl");
hello worl ^ <= pointer to "print head"
/* part2 */ printf("\b");
/* part3 */ printf("\b");
/* part4 */ printf("d\n");
hello wodl ^ <= pointer to "print head" on the next line
If you want a destructive backspace, you'll need something like
"\b \b"
例如,一个退格,一个空格,和另一个退格。
在每个字符后面使用一个退格 printf("hello wor\bl\bd\n");
printf("hello wor\bl\bd\n");