Как реализуется \ b? - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть следующая программа, в которой я пытаюсь понять функционирование escape-последовательности \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 и другие escape-последовательности разрешены во время компиляции или во время выполнения?

Ответы [ 4 ]

9 голосов
/ 30 декабря 2011

\b - это такой же символ, как и любой другой в вашей программе. Он становится особенным, только когда терминал его видит.

Символы ниже ASCII 32 называются «управляющими символами» по причине: они являются сигналом для устройства отображения, то есть вашего терминала или консоли, что оно должно сделать что-то особенное, например звуковой сигнал (\a), переместить курсор назад (\b) или к следующей позиции табуляции (\t).

1 голос
/ 30 декабря 2011

\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"
1 голос
/ 30 декабря 2011

strlen() будет проходить через указатель на символ, указанный в качестве аргумента, пока не найдет 0.

Но \b - это не 0, поэтому вы видите то, что видите.

Действие, связанное с этим персонажем, однако, связано с вашим устройством вывода.

1 голос
/ 30 декабря 2011

Разрешено во время выполнения. Длина строки включает в себя длину \b, но консоль "движок рендеринга" отображает / выполняет backspace.

...