web-dev-qa-db-ja.com

バックスラッシュを含むprintfの出力について(\ 012)

この簡単なコードの出力を理解するのを手伝ってくれませんか:

const char str[10] = "55\01234";
printf("%s", str);

出力は次のとおりです。

55
34
33

文字列内の文字シーケンス\0128進エスケープシーケンス として解釈されます。 8進数として解釈される値012は、10進数の10であり、ほとんどの端末では改行(\n)文字です。

ウィキペディアのページから:

8進数のエスケープシーケンスは、\とそれに続く1、2、または3桁の8進数で構成されます。 8進エスケープシーケンスは、3桁の8進数字がすでに含まれているか、次の文字が8進数字でない場合に終了します。

シーケンスには3つの有効な8進数が含まれているので、それが解析されます。 334は、4桁目となり、3桁しかサポートされないため、続行されません。

したがって、文字列を"55\n34"と書くことができます。これは、表示されているものをより明確に示し、改行をハードコーディングするのではなく、コンパイラに適切なものを生成させるため、移植性が向上します。

40
unwind

\012は、シンボルのoctalコードを表す エスケープシーケンス です。

012 = 10 = 0xa = LINE FEED (in ASCII)

したがって、文字列は55[LINE FEED]34のようになります。

LINE FEED文字は、多くのプラットフォームで 改行シーケンス として解釈されます。端末に2つの文字列が表示されるのはそのためです。

17
myaut

\012は、他の人がすでに述べたように、改行エスケープシーケンスです。 (chuxの絶対的な正しいコメントとして、ASCIIが使用されている文字セットでない場合は異なります。ただし、この表記では8進数です。)

これは、ISO/IEC 9899のc99について述べているように、標準によって意味されます

ために:

6.4.4.4文字定数

[...]

3単一引用符 '、二重引用符 "、疑問符?、円記号\、および任意の整数値は、次のエスケープシーケンスの表に従って表現できます。

単一引用符 '\'

二重引用符「」

疑問符? \?

バックスラッシュ\ \

8進文字\ 8進数字

16進文字\ x 16進数字

そして、それがバインドされる範囲:

制約

9 8進数または16進数のエスケープシーケンスの値は、整数文字定数の場合はunsigned char型、ワイド文字定数の場合はwchar_tに対応するunsigned型の表現可能な値の範囲内でなければなりません。

6
dhein