2017-12-28 28 views
0

私は次のコードについて少し混乱しています:cの " t"、 " r"、 " b"の効果は何ですか?

#include <stdio.h> 
int main() 
{ 
    printf("\nab"); 
    printf("\bsi"); 
    printf("\rha"); 
    return 0; 
} 

私はLinux上でプログラムを実行すると、それは

ha 

を印刷します。しかし、私はXcodeの上でそれを実行したとき、それは

を印刷します
absi 
ha 

"\ t"、 "\ b"、 "\ r"について少し混乱していますが、プログラムの仕組みを理解できません。

+2

プログラムはまったく同じ動作します。端末によって異なる制御文字が解釈されるため、異なる結果が表示されます。正しい質問は、 "どのように' \ r'がCで動作するのか "\ r"がLinux端末でどのように動作するかではありません。 '\ r'を出力するために使用する言語は無関係です。 –

+1

@ n.m。実際にはC標準は '\ r' *がどのように動作すべきかを指定しています。 Xcodeはそれを守っていません。 –

+0

@AnttiHaapala標準では、 '\ r'がディスプレイデバイス上で何を意図しているのかを示しています。 XCodeコンソールウィンドウはディスプレイデバイスですか? 1つを構成するものは何も定義されていないため、意図的なものだけであり、それ以上のものはありません。 –

答えて

1

\tは、キャリッジリターンとタブ文字、\r(タイプライターを考える)を参照し、非破壊バックスペースに\b。 crvvが指摘しているように、同じ出力は常にstdout:"\nab\bsi\rha"に送られます。しかし、あなたの端末とXCodeは異なる出力を(選択によって)生成します。

お使いの端末は、以下を行います:それは\nを見て、新しい行に行く、それはabと「店舗」というを見ているが、それは非破壊バックスペースを実行しますので、それは、\bを見ています。当初

ab 
^

\bに遭遇した後:カーソルがあることを

ab 
^ 

これは、基本的に新しい文字が書かれているポイント別名カーソルを意味し、1つのスペース戻り現在はbの下にあるので、後続の文字があれば上書きされます。

次に、sに読み込み、iので、我々が得る:

asi 
^

次に、それは、\rに読み込みます。これは古いタイプライターが行の先頭にカーソルを戻すカーリッジリターンです。だから今、私たちはしている:

asi 
^ 

最後に、それはhaに読み込み、カーソルがaの下にあるので、haasを上書きします:

hai 
^

ここでの事です。カーソルがiの下にあるまだであることに注意してください。それは、次の空きスペースの下ではありません。あなたのプログラムprintfは、printf("\rha")の後に何も印刷しないので、端末があなたの出力を印刷するとき、カーソルはiの下に留まります。

端末が出力する次のものは何ですか?通常は通常のプロンプトです([email protected])。 これはiを上書きするため、[email protected]のように表示されます。

Xcodeは、それとは少し異なります。したがって、カーソルが戻って文字を行かないようにそれは、\bを消費し、\rは改行として扱われます。

absi 
ha 
+0

しかし、\ bがsiの後にbが上書きされ、 "asi"となると "\ rha"に出会うと "hai"と出力されるはずです。 – Victoria

+0

@Victoria私はその問題が何であったかを理解した。 – ubadub

+0

私は今理解しています。ありがとうございました:) – Victoria

0

プログラムは、常に "\ nab \ bsi \ rha"をstdoutに書き込みます。

これはどのように表示されるかによって異なります。

gcc hello.c && ./a.out | xxdを使用して確認できます。

00000000: 0a61 6208 7369 0d68 61     .ab.si.ha 
0

\rCR(キャリッジリターン)コードです。これは、行の先頭にカーソルを戻します。あなたには "ab"があり、次に\bはバックスペースです。 "si"に続いて "b"が上書きされ、 "asi"になります。次に\rが行の先頭に移動し、 "as"の代わりに "ha"が表示されます。結果は "hai"です。しかし、カーソルは "s"の後ろにあり、Bashプロンプトが表示されているときはカーソルの後の最初の空き位置なので "i"を置き換えます。そして、あなたは "ha {prompt-message}"を見ます。 「hai」を見るために\rhaの後に\nを追加してください。

+0

bashプロンプトとは何ですか? – Victoria

+0

@Victoria Linuxのシェルが 'bash'の場合、DOSの' user @ host 'や' C:\> 'のような打ち込みコマンドを打つ前に、bashプロンプトがコマンドラインのテキストになります。このテキストはプロンプトと呼ばれます。 Bashプロンプトは "bashシェルのプロンプト"です。 – i486

+0

私は\ rの後に\ nを追加しようとしていて、 "hai"を見ました。今、私は分かる。ありがとうございました! – Victoria

関連する問題