以下の文字列には、ヌルターミネータ '\ 0'が含まれますか?
std::string temp = "hello whats up";
ありがとう!:)
以下の文字列には、ヌルターミネータ '\ 0'が含まれますか?
std::string temp = "hello whats up";
ありがとう!:)
回答:
いいえ。ただしtemp.c_str()
、nullターミネータがこのメソッドからの戻りに含まれると言う場合。
他の文字と同じように、文字列にヌル文字を含めることができることも言う価値があります。
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
プリント
5 5
5 1
ヌル文字が文字列に対して特別な意味を持っている場合は、予想どおりではありません。
temp.c_str()
、ヌル文字が含まれます。文字列に本当に必要な場合は、他の文字と同じように追加してください。temp.push_back('\0')
。これでtemp.c_str()
、2つのヌル文字が含まれます。
C ++ 03にはありません。また、C ++ 11より前では、C ++ std :: stringがメモリ内で連続していることも保証されていません。C文字列(文字列を格納することを目的としたchar配列)のみにnullターミネータがありました。
C ++ 11以降では、mystring.c_str()
と等価であるmystring.data()
と同等であり&mystring[0]
、そしてmystring[mystring.size()]
あることが保証されます'\0'
。
これは、ここでの「含む」の定義によって異なります。に
std::string temp = "hello whats up";
注意すべきことがいくつかあります。
temp.size()
最初h
から最後までの文字数を返しますp
(両方を含む)temp.c_str()
またはターミネーターでtemp.data()
戻ってきnull
ますint(temp[temp.size()])
、ゼロになります私が知っている、私はここの回答の一部に似た音が、私はあることを指摘したいsize
のstd::string
でC++
されて別々に維持し、それが似ていないで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
参照:
はい、を呼び出すとtemp.c_str()
、nullで終了するc文字列が返されます。
ただし、オブジェクトに格納されている実際のデータはtemp
nullで終了しない場合がありますが、プログラマーが必要なときにnullを返すことが保証されているオブジェクトconst char*
を呼び出すため、プログラマーにとっては重要ではなく、重要ではありません。c_str()
-終了した文字列。
temp.size()
。
std::string
内部的に文字数のカウントを保持します。内部的には、このカウントを使用して機能します。他の人が言っているように、表示のために文字列が必要な場合、または何らかの理由c_str()
で、最後にnullターミネータが付いた文字列を提供するメソッドを使用できます。