28

私はいくつかのCパズルの質問をしています。ほとんどの場合、正しい答えを見つけることができますが、その答えには問題があります。コンパイラを使えば正解はわかるのですが、その理由がわかりません。

コードを見てください:

char c[] = "abc\012\0x34";

strlen(c)標準 C コンパイラを使用すると、何が返されるでしょうか?

私が期待していたのは 3 だったのに、私のコンパイラは 4 を返します。

strlen()最初に出現した文字を検索すると思っていたのNULLですが、どういうわけか、結果は予想よりも 1 つ多くなっています。

理由はありますか?

4

1 に答える 1

60

かきましょう

char c[] = "abc\012\0x34";

単一の文字で:

char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };

最初に表示されるのは、次の 8 進数にまたがる\08 進数のエスケープ シーケンスの開始です。\012

8 進数のエスケープ シーケンスは、標準 (N1570 ドラフト) のセクション 6.4.4.4 で指定されています。

8 進エスケープ シーケンス:
\ 8 桁
\ 8 桁 8 桁 8 桁
\ 8 桁 8 桁

バックスラッシュの後に 1 桁、2 桁、または 3 桁の 8 進数が続きます。そのセクションのパラグラフ 7 では、8 進数および 16 進数のエスケープ シーケンスの範囲が示されています。

7 8 進数または 16 進数の各エスケープ シーケンスは、エスケープ シーケンスを構成できる最長の文字シーケンスです。

8 進エスケープ シーケンスの長さは最大で 3 桁の 8 進数字に制限されていますが (したがって"\123456"、5 文字で構成されます{ '\123', '4', '5', '6', '\0' })、16 進エスケープ シーケンスの長さは無制限です。

16 進エスケープ シーケンス:
\x 16 進数字
16 進エスケープ シーケンス 16 進数字

したがって"\x123456789abcdef"、2 文字 ( { '\x123456789abcdef', '\0' }) のみで構成されます。

于 2013-01-10T18:11:30.927 に答える