どちらもヌル終了文字シーケンスの長さを返すという点で同等です。どちらかを優先する理由はありますか?
4 に答える
より単純な代替手段を使用してください。std::char_traits::length
すべてが素晴らしいですが、C 文字列の場合は同じであり、コードがはるかに長くなります。
コードの肥大化を避けてください。私は、同等の C よりも C++ 関数の大ファンです (たとえば、 orはまったく使用しませんが、完全に問題ありません)。しかし、避けるのはばかげているだけです。std::strcpy
std::memcpy
std::copy
std::strlen
C++ 関数のみを使用する理由の 1 つは、インターフェイスの統一性です。たとえば、 と の両方がひどいインターフェイスstd::strcpy
を持っています。std::memcpy
ただし、std::strlen
C++ の最高の伝統に基づく完全に優れたアルゴリズムです。確かに一般化されていませんが、標準ライブラリにある他のクラス固有の無料関数も一般化されていません。
std::strlen()
は C 標準ライブラリからの継承であり、でのみ動作しますconst char*
(文字列が null で終了していない場合、未定義の動作をするという点で安全ではありません)。文字列がワイド文字セット ( などconst unsigned short*
) を使用している場合、std::strlen()
は役に立ちません。
std::char_traits<T>::length()
は型が何であれ動作しT
ます (たとえば、 である場合unsigned short
でも適切に動作しますが、null で終了する値も必要です - これは最後の値でなければなりません-渡された のT(0)
配列がnull で終了していない場合、T
動作も未定義です)。
一般に、文字列を扱う場合は、std::string::length()
C スタイルの文字列を使用する代わりに使用する方が適切です。
ザック・ハウランドもコンラッド・ルドルフも一理あります。ありがとう。私は両方の答えを受け入れます。要約された回答は次のようになります: 短いコードまたは C++ 標準ライブラリのいずれかに対する個人的な好み以外には何もないようです (タイトルからわかるように、一般化は質問のポイントではなかったので省略します)。
std::strlen()
const char*
引数として取る C 標準ライブラリ互換 (ISO C++ の一部ですが) 関数です。クラスlength()
のファミリーのメソッドです。std::string
したがって、 on を使用strlen()
するstd::string
場合は、次のように記述する必要があります。
strlen(mystring.c_str())
これは より整頓されていませんmystr.length()
。それとは別に、具体的な違いはないはずです(つまり、char
タイプについて)。