strcmp()
(no 'n')は、どちらの引数にもヌル文字が表示されるとすぐに処理を停止し、結果を返します。
したがって、引数の1つがヌルで終了することが100%確実であることがわかっている場合(たとえば、文字列リテラルの場合)、strncmp()
( 'n')を使用した場合のセキュリティ上のメリットはありません。strlen()
strcmp()
は既知の終端文字列より多くの文字を読み取ることは決してないため、第3引数の一部を使用して、既知の文字列長との比較を制限します。それが知られている、終端の大きさに時間を浪費線形ことにstrncmp()式のstrlen()は、strcmp()をstrncmp()を使用する目的を無効にしますか?
実際には、長さ引数strncmp()
への呼び出しがstrcmp()
ケースからのみ異なる最初の二つの引数の1にstrlen()
されているように私には思えます文字列をstrlen()
と評価してください。
は考えてみましょう:
サンプルコードA:
if (strcmp(user_input, "status") == 0)
reply_with_status();
サンプルコードB:
if (strncmp(user_input, "status", strlen("status")+1) == 0)
reply_with_status();
を、後者を超える前者どんな利点がありますか?私は他人のコードでそれを見ているので、小物。
これらの機能の仕組みに間違いがありますか?
私はあなたをupvoteしたが、私は十分な評判を持っていない。 :pあなたの詳細な答えをありがとう! – cvp
ほとんどのコンパイラは 'strlen(" status ")'を定数として計算できます。それ以外の場合は同意します。 –