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”的长度为零。另一个重载 ,str.append("\0\0",2)只取你给它的长度,所以它附加了两个字符。

从标准:

  basic_string&
   append(const charT* s, size_type n);

7         要求: s指向至少n包含charT.

8         次抛出: length_error 如果 size() + n > max_size()。

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 .

                                                               — [string::append] 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) 确定)。

第二个版本(您的第一个版本)考虑了空终止符(在您的情况下正是第一个字符)。第一个没有。

于 2012-09-05T15:43:41.063 回答