我有这段代码说:
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!为什么呢?
答案 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(在您的情况下恰好是第一个字符)。第一个没有。