16

strlen()内部的にはどのように機能しますか? 関数に固有のバグはありますか?

4

1 に答える 1

55

strlen\0通常、文字が見つかるまで文字列内の文字をカウントすることによって機能します。正規の実装は次のようになります。

size_t strlen (char *str) {
    size_t len = 0;
    while (*str != '\0') {
        str++;
        len++;
    }
    return len;
}

関数に固有のバグの可能性については、何もありません。文書化されているとおりに機能します。特定の問題がないと言っているわけではありません。

  • \0末尾にa がない「文字列」を渡すと、問題が発生する可能性がありますが、技術的には、それは C 文字列(a) ではなく、ユーザー自身の責任です。
  • 文字列内に文字を入れることはできません\0が、その場合も C 文字列にはなりません。
  • これは最も効率的な方法ではありません。長さを前もって保存できるので、長さをより迅速に取得できます。

しかし、これらはどれもバグではなく、設計上の決定の結果にすぎません。

最後の箇条書きについては、Joel Spolsky によるこの優れた記事も参照してください。彼は、通常の C 文字列 (ターミネータ付き)、パスカル文字列 (長さ付き)、および null で終了する 2 つの組み合わせなど、さまざまな文字列形式とその特性について説明しています。パスカル弦。

彼は、その最終的な型を表す「カラフルな」用語をもっと持っていますが、Python の優れた (そしてまったく関係のない) f-strings のことを考えるたびに頻繁に思い浮かぶ用語です:-)


(a) AC 文字列は、一連の非ターミネータ文字 ( 以外の任意の文字) とそれに続くターミネータとして定義さます\0。したがって、この定義では、シーケンス内に埋め込まれたターミネータと、そのようなターミネータのないシーケンスの両方が許可されていません。または、より簡潔に言えば (ISO C 標準に従って):

文字列は、最初の null 文字で終了し、最初の null 文字を含む連続した一連の文字です。

于 2010-11-09T10:56:41.540 に答える