std :: stringにnullターミネータが含まれていますか?


90

以下の文字列には、ヌルターミネータ '\ 0'が含まれますか?

std::string temp = "hello whats up";

ありがとう!:)



1
現在のところ、@ jahhajから受け入れられた回答は、user529758からの回答と競合します。user529758の回答は間違いなく最新のものです。熟読しながらジェシー・グッドのコメントをスキップしたので、ここではその重要性を強調します。
JonathanKomar20年

回答:


100

いいえ。ただしtemp.c_str()、nullターミネータがこのメソッドからの戻りに含まれると言う場合。

他の文字と同じように、文字列にヌル文字を含めることができることも言う価値があります。

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';

プリント

5 5

5 1ヌル文字が文字列に対して特別な意味を持っている場合は、予想どおりではありません。


5
呼び出すとtemp.c_str()、ヌル文字が含まれます。文字列に本当に必要な場合は、他の文字と同じように追加してください。temp.push_back('\0')。これでtemp.c_str()2つのヌル文字が含まれます。
jahhaj 2012

1
@dupdupdupは、一部の返信で言及されているように、nullで終了する文字列が必要な場合は、構築されたオブジェクトでs.c_str()を呼び出す必要があります。最後に「\ 0」が付いていることが保証されている文字配列へのポインタを返します。
Maksim Skurydzin 2012

@ Rico、Jahhaj文字列を終了する方法。たとえば、文字列にstr [i]としていくつかの文字を追加しました。現在、coutを使用して印刷することはできません。
Bhavuk Mathur 2016

要点を追加するには:演算子<<がオーバーロードされているため、cout << sは、文字ごとに完全な文字列を出力しますが、c_str()を取得して演算子<<を指定すると、ヌル文字。次のプログラムはこの点を損なう。{文字列s( "SampleString"); cout << s.size()<< "\ t" << s << endl; s [3] = '\ 0'; cout << "\ n \ nヌルの後\ n \ n" << s.size()<< "\ t" << s << endl; cout << "\ n \ nc_strを取得\ n \ n" << s.size()<< "\ t" << s.c_str()<< endl; }
Fooo 2018

71

C ++ 03にはありません。また、C ++ 11より前では、C ++ std :: stringがメモリ内で連続していることも保証されていません。C文字列(文字列を格納することを目的としたchar配列)のみにnullターミネータがありました。

C ++ 11以降では、mystring.c_str()と等価であるmystring.data()と同等であり&mystring[0]、そしてmystring[mystring.size()]あることが保証されます'\0'


4
C ++ 11では、文字列がメモリ内で連続していることが保証されるようになりました。
zneak 2012

@zneakありがとう!更新しました。しかし、少なくとも合理的にC ++ 11コンパイラのコンパイラがあるとは思えません... GCCでさえサポートを破っています。

4
@ H 2 CO 3:脇C ++ 11、これはに対処したDR 5302005。標準ライブラリの実装の大部分は、文字列データを少なくとも同じ期間、連続したメモリに保存しています。
ildjarn 2012

3
ありがとう@ildjarn、私はそれを正確に探していました。移動の理由の一部は、委員会の誰もが連続メモリを使用しないSTL実装を知らなかったということでした。
zneak 2012

7
@ H2CO3:正直なところ、それがあなたを怒らせたなら、あなたはより厚い皮膚を必要とします。
ildjarn 2012

9

これは、ここでの「含む」の定義によって異なります。に

std::string temp = "hello whats up";

注意すべきことがいくつかあります。

  • temp.size()最初hから最後までの文字数を返しますp(両方を含む)
  • しかし同時に、temp.c_str()またはターミネーターでtemp.data()戻ってきnullます
  • または言い換えればint(temp[temp.size()])ゼロになります

私が知っている、私はここの回答の一部に似た音が、私はあることを指摘したいsizestd::stringC++されて別々に維持し、それが似ていないC、あなたが最初に見つけない限り、あなたがカウントを保つどこnullターミネータを。

さらに、string literalが埋め込まれて\0いる場合、ストーリーは少し異なります。この場合、次のように、構築はstd::string最初のnull文字で停止します。

std::string s1 = "ab\0\0cd";   // s1 contains "ab",       using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s;  // s3 contains "ab\0\0cd", using ""s operator

参照:


2

はい、を呼び出すとtemp.c_str()、nullで終了するc文字列が返されます。

ただし、オブジェクトに格納されている実際のデータはtempnullで終了しない場合がありますが、プログラマーが必要なときにnullを返すことが保証されているオブジェクトconst char*を呼び出すため、プログラマーにとっては重要ではなく、重要ではありません。c_str()-終了した文字列。


1
また、ヌルターミネータ(存在する場合)はからの戻りに含まれませんtemp.size()
jahhaj 2012

1

C ++文字列を使用すると、それについて心配する必要はなく、実装に依存する可能性があります。

を使用temp.c_str()すると、文字列のC表現が得られます。これには、文字が確実に含まれます\0。それ以外は、C ++文字列でどのように役立つかはわかりません。


1

std::string内部的に文字数のカウントを保持します。内部的には、このカウントを使用して機能します。他の人が言っているように、表示のために文字列が必要な場合、または何らかの理由c_str()で、最後にnullターミネータが付いた文字列を提供するメソッドを使用できます。


このステートメントの参照をいくつか挙げてください。 "std :: stringは、内部的に文字数のカウントを保持します。内部的には、このカウントを使用して機能します"
rimalroshan 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.