C ++では、string
「ギブス」と言うサイズを取得しようとしています。
関数を使用しsizeof
ていると、実際のサイズよりも小さいサイズが返されます。
私は以下のコードを持っています:
string s = "gibbs";
cout << sizeof(s) <<endl;
出力は : 4 です。5 である必要があると思います。
この問題を解決する方法。sizeof の戻り値に常に +1 を追加できますが、それは完璧な解決策でしょうか?
sizeof(s)
s
オブジェクトに格納されている文字列の長さではなく、オブジェクトのサイズを示しますs
。
これを書く必要があります:
cout << s.size() << endl;
std::basic_string
(および拡張によりstd::string
)size()
メンバー関数があることに注意してください。と同じ値を返すメンバー関数std::basic_string
もあります。したがって、次のように書くこともできます。length
size()
cout << s.length() << endl;
、、size()
などの標準ライブラリの他のコンテナーにはメンバー関数がありますが、 はありません。つまり、標準ライブラリ コンテナー クラス テンプレートの統一インターフェイスです。(または他のコンテナー クラス テンプレート) のために特に覚えておく必要はありません。メンバー関数はその意味での逸脱です。std::vector
std::list
std::map
size()
length()
size()
std::string
std::string::length()
sizeof(s)
あなたの例では のサイズを返していますがstd::string
、そのメンバーが指している内容とは関係ありません。
この問題を解決する方法。sizeof の戻り値に常に +1 を追加できますが、それは完璧な解決策でしょうか?
いいえ、値は一定であり、sizeof
期待する値を提供していないため、何も解決しません。
文字列の文字シーケンスに必要な文字数を知りたい場合は、s.length()
またはs.size()
-- その値に 1 を追加して、終了文字列に必要なサイズを知ることができます。
sizeof
の値は、ライブラリやプラットフォーム間で一貫していないことにも注意してください。std::string
実装は大きく異なる場合があります。特に、ポインターのサイズに違いが見られる場合があり、小さな文字列の最適化が見られる場合があります。
sizeof
std::string
システム上にたまたまあるオブジェクトの型のサイズを返します4
。これは、処理している の実装がpimpl イディオムを使用していることが原因である可能性があります。つまり、探している実際の実装へのポインターが含まれているだけで、ポインターはホスト環境でたまたま32 ビットになっているためです。ただし、 C++11 標準の仕様に準拠しなくなった のコピー オン ライト実装を使用している可能性が高くなります。std::string
std::string
std::string
std::basic_string
特にstd::basic_string<char>
;テンプレート クラスの特殊化として定義されています。のドキュメントを参照してくださいstd::basic_string
。と のどちらかを見てstd::basic_string::size
くださいstd::basic_string::length
。
std::string s = "stackoverflow";
std::assert(s.size() == 13);
これは、システムの文字列型のサイズであり、基になるデータのサイズではないためです。例えば:
#include <iostream>
int main (void) {
std::string s1 = "gibbs";
std::string s2 = "a much longer string";
std::cout << sizeof(s1) << '\n';
std::cout << sizeof(s2) << '\n';
std::cout << s1.length() << '\n';
std::cout << s2.length() << '\n';
return 0;
}
生成:
4
4
5
20
つまり、std::string::length()
文字列の長さを取得するために使用する必要があります。