1

私はこのコードに次のように言っています:

 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を印刷しています!なんで?

4

2 に答える 2

4

これ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() + nsize()*thisns

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

于 2012-09-05T15:41:35.120 に答える
3

ドキュメントから:

string& append ( const char * s, size_t n );

s が指す文字配列の最初の n 文字で形成された文字列のコピーを追加します。

string& append ( const char * s );

s が指すヌル終了文字シーケンス (C 文字列) によって形成された文字列のコピーを追加します。この文字シーケンスの長さは、(traits.length(s) によって決定される) ヌル文字の最初の出現によって決定されます。

2 番目のバージョン (最初のバージョン) では、null ターミネータ (この場合は正確に最初の文字) が考慮されます。最初のものはしません。

于 2012-09-05T15:43:41.063 に答える