3

私は\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印刷されますが、2文字を含む7Hellstrlen()返されます。\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

4 に答える 4

9

\bプログラム内の他の文字と同じようにです。ターミナルがそれを見るときだけそれは特別になります。

ASCII 32より下の文字は、次の理由で「制御文字」と呼ばれます。これらは、ビープ音(\a)、カーソルを後方(\b)に移動する、または次のタブストップ(\t)。

于 2011-12-29T20:57:43.583 に答える
1

実行時に解決されました。文字列の長さには\b長さが含まれますが、コンソールである「レンダリングエンジン」がバックスペースを表示/実行しています。

于 2011-12-29T20:57:36.700 に答える
1

strlen()0が見つかるまで、引数として指定されたcharポインタを調べます。

しかし\b、0ではありません。これがあなたが見ているものを見る理由です。

ただし、このキャラクターにリンクされているアクションは、出力デバイスにリンクされています。

于 2011-12-29T20:57:50.823 に答える
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"
于 2011-12-29T20:58:08.777 に答える