字符串长度函数的奇怪行为w.r.t null字符?

时间:2012-09-05 15:39:51

标签: c++ string

我有这段代码说:

 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!为什么呢?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

来自文档:

  

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

     

附加。的副本   由字符数组中的前n个字符组成的字符串   s指出。

     

string& append ( const char * s );

     

附加。的副本   由以null结尾的字符序列(C字符串)形成的字符串   s指出。该字符序列的长度由下式确定   空字符的第一个出现(由。确定)   traits.length(S))。

第二个版本(您的第一个版本)考虑了null-terminator(在您的情况下恰好是第一个字符)。第一个没有。