この簡単なコードの出力を理解するのを手伝ってくれませんか:
const char str[10] = "55\01234";
printf("%s", str);
出力は次のとおりです。
55
34
文字列内の文字シーケンス\012
は 8進エスケープシーケンス として解釈されます。 8進数として解釈される値012
は、10進数の10
であり、ほとんどの端末では改行(\n
)文字です。
ウィキペディアのページから:
8進数のエスケープシーケンスは、
\
とそれに続く1、2、または3桁の8進数で構成されます。 8進エスケープシーケンスは、3桁の8進数字がすでに含まれているか、次の文字が8進数字でない場合に終了します。
シーケンスには3つの有効な8進数が含まれているので、それが解析されます。 3
の34
は、4桁目となり、3桁しかサポートされないため、続行されません。
したがって、文字列を"55\n34"
と書くことができます。これは、表示されているものをより明確に示し、改行をハードコーディングするのではなく、コンパイラに適切なものを生成させるため、移植性が向上します。
\012
は、シンボルのoctal
コードを表す エスケープシーケンス です。
012 = 10 = 0xa = LINE FEED (in ASCII)
したがって、文字列は55[LINE FEED]34
のようになります。
LINE FEED
文字は、多くのプラットフォームで 改行シーケンス として解釈されます。端末に2つの文字列が表示されるのはそのためです。
\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型の表現可能な値の範囲内でなければなりません。