私はこのコードに次のように言っています:
std::string str("ashish");
str.append("\0\0");
printf("%d", str.length());
6を印刷していますが、このコードがある場合
std::string str("ashish");
str.append("\0\0",2);
printf("%d", str.length());
8を印刷しています!なんで?
これstr.append("\0\0")
は、ヌル文字を使用して文字列の末尾を決定するためです。したがって、「\0\0」は長さゼロです。もう 1 つのオーバーロードでstr.append("\0\0",2)
ある は、指定した長さを取るだけなので、2 文字が追加されます。
標準から:
basic_string& append(const charT* s, size_type n);
7 必須:
s
少なくともn
の要素の配列を指しcharT
ます。8 スロー: size() + n > max_size() の場合、length_error。
9 効果:この関数は、 によって制御される文字列を、最初の要素が によって制御される元の文字列のコピーであり、残りの要素が の最初の要素のコピーで
*this
ある長さの文字列に置き換えます。size() + n
size()
*this
n
s
10 戻り値:
*this
.basic_string& append(const charT* s);
11 必須:
s
少なくともtraits::length(s) + 1
の要素の配列を指しcharT
ます。12 効果:呼び出し
append(s, traits::length(s))
。13 戻り値:
*this
.— [文字列::追加] 21.4.6.2 p7-13
ドキュメントから:
string& append ( const char * s, size_t n );
s が指す文字配列の最初の n 文字で形成された文字列のコピーを追加します。
string& append ( const char * s );
s が指すヌル終了文字シーケンス (C 文字列) によって形成された文字列のコピーを追加します。この文字シーケンスの長さは、(traits.length(s) によって決定される) ヌル文字の最初の出現によって決定されます。
2 番目のバージョン (最初のバージョン) では、null ターミネータ (この場合は正確に最初の文字) が考慮されます。最初のものはしません。