私は以下のように声明を持っているコードの一部に取り組んでいます:場合(memcmp(バージョン、 "のX0の X0ののX0"、3)== 0)
if (memcmp (version, "\x0\x0\x0", 3) == 0)
データであり、どのようなそれはバージョンと比較されていますか?それは "000"と比較するのと同じですか? X0 \
私は以下のように声明を持っているコードの一部に取り組んでいます:場合(memcmp(バージョン、 "のX0の X0ののX0"、3)== 0)
if (memcmp (version, "\x0\x0\x0", 3) == 0)
データであり、どのようなそれはバージョンと比較されていますか?それは "000"と比較するのと同じですか? X0 \
号 はNULLのリテラルです。 "000"は数字で、メモリ内の表現が異なります。
'\ x0'(または' \ 0')はNUL文字のリテラルです。通常、ポインタにはNULL(2つのLを持つ)が予約されています。 –
'' 000 ''は数字ではありません。文字列です。 – mizo
いいえ、"000"
と同じではありません。 3つのヌル(0)バイトを比較しています。各バイトはバイナリでゼロの実際の値です。これは、48である印刷可能文字0
、のASCII値を含む文字列である、"000"
とは異なる(又はヘクスで30)
"000"
だからが"\x30\x30\x30"
と同じであろう。
ありません - それは"000"
と比較すると同じではありません。 3つのヌル文字と比較しています。同等の、おそらくより期待される文字列は"\0\0\0"
になります。または、この場合はコードが3文字しかチェックしていないので、0
で3文字の配列を埋め込んでください。
トリッキーにしたいのであれば、\ "\ 0 \" "(サイズは\" sizeof "\ 0 \ 0" ')を使うことができます。 –
"\x0\x0\x0"
は{ 0x00, 0x00, 0x00, 0x00 }
に等しいです。 4番目のゼロは、文字列ヌルターミネータです。
だから、あなたの質問に答えるためには - いいえ、それは"000"
との比較と同じではありません。
'\x0'
は、16進数のゼロで、'0'
は、0
(16進数の30)のASCIIコードです。
\x0
は、値がchar
であることを表します。0
は、0x30のASCII文字です。
変数version
の定義を知って興味深いものになるだろう。それはvoid *
またはchar *
または他の変なキャスティングですか?コンパイル中に警告が表示される可能性があります。
またversion
がちょうどエラーがないことを確認するために初期化される方法を見てするのが賢明だろう。確かに、プログラム内のバージョン番号がないかどうかを確認するのは奇妙な方法です。
サイドノート:この非常に特殊なケースでは、それぞれの 'x'は不要です。 – Mehrdad