1

C ++では、string「ギブス」と言うサイズを取得しようとしています。

関数を使用しsizeofていると、実際のサイズよりも小さいサイズが返されます。

私は以下のコードを持っています:

 string s = "gibbs";
 cout << sizeof(s) <<endl;

出力は : 4 です。5 である必要があると思います。

この問題を解決する方法。sizeof の戻り値に常に +1 を追加できますが、それは完璧な解決策でしょうか?

4

4 に答える 4

9

sizeof(s)sオブジェクトに格納されている文字列の長さではなく、オブジェクトのサイズを示しますs

これを書く必要があります:

cout << s.size() << endl;

std::basic_string(および拡張によりstd::stringsize()メンバー関数があることに注意してください。と同じ値を返すメンバー関数std::basic_stringもあります。したがって、次のように書くこともできます。lengthsize()

cout << s.length() << endl;

、、size()などの標準ライブラリの他のコンテナーにはメンバー関数がありますが、 はありません。つまり、標準ライブラリ コンテナー クラス テンプレートの統一インターフェイスです。(または他のコンテナー クラス テンプレート) のために特に覚えておく必要はありません。メンバー関数はその意味での逸脱です。std::vectorstd::liststd::mapsize()length()size()std::stringstd::string::length()

于 2012-08-25T06:09:10.220 に答える
4

sizeof(s)あなたの例では のサイズを返していますがstd::string、そのメンバーが指している内容とは関係ありません。

この問題を解決する方法。sizeof の戻り値に常に +1 を追加できますが、それは完璧な解決策でしょうか?

いいえ、値は一定であり、sizeof期待する値を提供していないため、何も解決しません。

文字列の文字シーケンスに必要な文字数を知りたい場合は、s.length()またはs.size()-- その値に 1 を追加して、終了文字列に必要なサイズを知ることができます。

sizeofの値は、ライブラリやプラットフォーム間で一貫していないことにも注意してください。std::string実装は大きく異なる場合があります。特に、ポインターのサイズに違いが見られる場合があり、小さな文字列の最適化が見られる場合があります。

于 2012-08-25T06:10:45.213 に答える
1

sizeofstd::stringシステム上にたまたまあるオブジェクトの型のサイズを返します4。これは、処理している の実装がpimpl イディオムを使用していることが原因である可能性があります。つまり、探している実際の実装へのポインターが含まれているだけで、ポインターはホスト環境でたまたま32 ビットになっているためです。ただし、 C++11 標準の仕様に準拠しなくなった のコピー オン ライト実装を使用している可能性が高くなります。std::stringstd::string

std::stringstd::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);
于 2012-08-25T06:21:22.693 に答える
1

これは、システムの文字列型のサイズであり、基になるデータのサイズではないためです。例えば:

#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()文字列の長さを取得するために使用する必要があります。

于 2012-08-25T06:09:06.443 に答える