45

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

char segname[16];

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

segnameなど、さまざまな文字列と比較したい__text

strncmpnull で終わらない文字列で呼び出すことは合法ですか?

この投稿は、それが合法であることを前提としています。このソースコードも合法です。しかし、私の男のページには次のように書かれています:

このstrncmp()関数は、null で終わる文字列s1と を辞書式に比較しますs2

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

何を参考にしようか迷っています。

4

2 に答える 2

67

C99 標準、セクション 7.21.4.4、§3. によると、次のことは合法です。

この関数は、 が指すヌル終了の可能性のある配列が が指すヌル終了の可能性がある配列より大きいstrncmp、等しい、または小さいため、ゼロより大きい、等しい、または小さい整数を返します。s1s2

ただし、文字の配列と表示されていることに注意してください。定義上、文字の配列が null で終了していない場合、それは文字列ではありません。

于 2017-01-01T20:37:32.633 に答える
15

strncmp 関数は、s1 が指す配列から s2 が指す配列と、最大 n 文字 (ヌル文字に続く文字は比較されません) を比較します。

仕様 7.24.4.2 はそれを述べています。C11規格。

null 文字の後に続かない文字は比較されないため、null で終わる文字配列または文字列が必要です。1

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

修正


[1] null 文字の後に続かない文字が比較されないということは、 がstrncmpnull で終わる文字列を想定しているという意味ではありません。strncmpこれは、(たとえば) abc\0def... とabc\0xyz... が等しいと言うために特別なケースが必要であることを意味します。null 終端されていない (指定された長さまでの) 2 つの char 配列を比較すること、または 1 つの null 終端された char 配列と null 終端されていない別の char 配列を比較することは何の問題もありません。
これはDavid Hammenのコメントから直接追加されます。

于 2017-01-01T20:35:43.510 に答える