我有以下程序,我试图理解\b
转义序列的功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int disp(char *a)
{
return printf("%s", a);
}
int main(void)
{
char *s = "Hello\b\b";
printf(" %d\n", disp(s));
printf("%s %d\n", s, strlen(s));
return 0;
}
输出:
$ ./a.out
Hel 7
Hel 7
$
按预期Hello\b\b
打印Hell
,但strlen()
返回7,其中包含两个\b
个字符。
根据C99 5.2.2 \b
定义如下:
\b (backspace) Moves the active position to the
previous position on the current line. If the
active position is at the initial position of
a line, the behavior of the display device is
unspecified.
\b
如何在与strlen()
等字符串相关的函数中进行解释?在编译时或运行时解析\b
和其他转义序列吗?
答案 0 :(得分:9)
\b
就像你的程序中的任何其他角色一样。只有当终端看到它时它才会变得特别。
ASCII 32以下的字符被称为“控制字符”,原因如下:它们是显示设备(即您的终端或控制台)的信号,它应该做一些特殊的事情,如哔声(\a
),将光标向后移动(\b
)或移动到下一个制表位(\t
)。
答案 1 :(得分:1)
在运行时解决。字符串的长度包括\b
长度,但“渲染引擎”(控制台)正在显示/执行退格。
答案 2 :(得分:1)
strlen()
将遍历作为参数给出的char指针,直到找到0。
但是\b
不是0,这就是你看到你所看到的原因。
但是,与此角色关联的操作会链接到您的输出设备。
答案 3 :(得分:1)
\b
仅影响输出。所有字符串函数仍将其视为字符。显示"Hello\b\b", 7
时,会发生这种情况(_表示光标位置):
H_
He_
Hel_
Hell_
Hello_
Hell_o - cursor moves backwards
Hel_lo - cursor moves backwards
Hel _o - the space overwrites the "l"
Hel 7_ - the "7" overwrites the "o"