如何实现\ b?

时间:2011-12-29 20:55:24

标签: c backspace

我有以下程序,我试图理解\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和其他转义序列吗?

4 个答案:

答案 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"