strlen()
は内部的にどのように機能しますか?
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規格に従って)より簡潔に記述します。
文字列は、最初のヌル文字で終了し、最初のヌル文字を含む、連続した文字のシーケンスです。