web-dev-qa-db-ja.com

strlen:どのように機能しますか?

strlen()は内部的にどのように機能しますか?

16
Manu

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

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

関数に固有のバグはなく、ドキュメントに記載されているとおりに機能します。

つまり、問題がないと言っているわけではありません。

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

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

参照 この優れた記事 Joel Spolsky著、通常のC文字列、Pascal文字列、2つのnullで終了するPascal文字列の組み合わせなど、さまざまな文字列形式とその特性について説明しています。彼らのために、「カラフルな」用語を言ってみましょう:-)


(a) C文字列は、一連の非ターミネータ文字(つまり、\0以外の文字)の後にそのターミネータが続くものとして定義されます。したがって、この定義では、シーケンス内に埋め込まれたターミネーターと、そのようなターミネーターのないシーケンスの両方を許可しません。

または、(ISO規格に従って)より簡潔に記述します。

文字列は、最初のヌル文字で終了し、最初のヌル文字を含む、連続した文字のシーケンスです。

53
paxdiablo