2011-12-29 24 views
3

私は\bエスケープシーケンスの機能を理解しようとしている次のプログラムを持っています。 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; 
} 

出力:期待Hello\b\bプリントHellが、2つの\b文字を含むstrlen()戻る7として

$ ./a.out 
Hel 7 
Hel 7 
$ 

。次のように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. 

はどのように\bstrlen()のような文字列関連の関数で解釈されますか? \bと他のエスケープシーケンスはコンパイル時または実行時に解決されますか?

答えて

9

\bは、あなたのプログラム内の他の文字と同様の文字です。それは端末がそれを見るときにのみ特別になります。

アスキー32以下の文字は、理由のため「制御文字」と呼ばれています。ビープ音(\a)のような特別な処理が必要な表示デバイス、つまり端末やコンソールへの信号です。 (\b)または次のタブストップ(\t)に移動します。それは0

しかし\bはあなたが見るものを見、なぜこれが、0ではありません見つけるまで

+4

実際、これらを「制御文字」といいます。 「エスケープ」とは、後続の文字の意味を変更するために使用される特定の制御文字を指します。 –

+0

@HotLicks:良い点、ありがとう。 – thiton

+0

(他に良い投稿 - 私はそれを+1しました) –

1

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

1

strlen()は、引数として指定されたcharポインタの上に移動します。

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

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" 
関連する問題