web-dev-qa-db-ja.com

nullで終了していない文字列をCのstrncmpに渡すことは合法ですか?

実行可能ファイルのセグメントの名前を保持する16バイトの配列があります。

_char segname[16];
_

セグメント名の長さが16バイト未満の場合、残りはヌルバイトで埋められます。それ以外の場合、終端のヌルバイトはありません。

segnameをさまざまな文字列と比較したい___text_。

strncmpをnullで終了しない文字列で呼び出すことは合法ですか?

この投稿 は合法であると想定しています。 このソースコード はそれを合法にします。しかし、私の男のページは言う:

strncmp()関数は、ヌル終了文字列_s1_と_s2_を辞書式に比較します。

strncmpに渡されるサイズは、segnameのサイズになります。

私は何を参照すべきか疑問に思っています。

45
Bilow

C99標準のセクション7.21.4.4、§3によると、それは合法です:

strncmp関数は、ゼロよりも大きい、等しい、または小さい整数を返します。それに応じて、s1が指すおそらくnullで終了する配列は、より大きい、等しいto、またはs2が指すおそらくnullで終了する配列よりも小さい。

ただし、文字のarrayと表示されていることに注意してください。定義により、文字の配列がNULLで終了しない場合、それはnot文字列です。

67
giusti

Strncmp関数は、s1が指す配列とs2が指す配列とをn文字以下で比較します(ヌル文字に続く文字は比較されません)。

仕様7.24.4.2にはそれが記載されています。C11標準

Null文字に続かない文字は比較されないため、nullで終わる文字配列または文字列が期待されます。1

ここでもヌル以外の終端文字を使用できますが、その場合は、チェックするまでの長さを指定する必要があります。これは場合によっては便利です。

訂正


[1]Null文字の後に続かない文字が比較されないということは、strncmpがnullで終わる文字列を期待しているという意味ではありません。これは、strncmpが(たとえば)abc\0def...およびabc\0xyz...比較等しい。 指定された長さまで)nullで終了しない2つのchar配列の比較、またはnullで終了しないchar配列とnullで終了しないchar配列の比較に問題はありません
これはDavid Hammenのコメントから直接追加されます

15
user2736738