0

C++文字列リテラルエスケープ文字のルールから、エリの答え

std::string ("0\0" "0", 3)  // String concatenation 

このバージョンのコンストラクターは char 配列を取るため、機能します。"0\0" "0" を const char* として渡そうとすると、それは C 文字列として扱われ、ヌル文字まですべてがコピーされます。

これは、文字列全体にスペースが割り当てられていないことを意味しますか?つまり、\0 の後の文字列は割り当てられていないスペースに書き込まれますか?

さらに、上記の質問は c++ 文字列に関するものですが、c 文字列についても同じ動作を観察しました。宣言中に文字列の途中に null char を追加すると、c と c++ の文字列は同じですか?

4

2 に答える 2

2

char 配列が新しいオブジェクトにコピーされます。char 配列の長さを指定しない場合、C++ は最初の null 文字までコピーします。どのくらいの追加スペースが割り当てられるかは、仕様の範囲外です。ベクトルと同様に、文字列には、文字列を格納するのに必要な量を超える容量があり、文字列を再配置せずに文字を追加できます。

于 2013-07-28T08:34:45.880 に答える
0

std::stringを受け取るコンストラクターconst char*は、入力が C 文字列であると想定します。C 文字列は'\0'終了しているため、'\0' 文字に達すると停止します。

本当にプレイしたい場合は、(C-String ではなく) char 配列から文字列を構築するコンストラクターを使用する必要があります。

STL シーケンス コンテナーは、自動的に保存するのに必要な量を超えています

例 :

int main () {

string s="Elephant";

s[4] ='\0'; //C++ std::string is NOT '\0' terminated
cout<<s<<endl; //Elep ant

string   x("xy\0ab");   // C-String assumed.

cout<<x; //xy
  return 0;
}
于 2013-07-28T08:50:00.883 に答える