我有这段代码说:
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”的长度为零。另一个重载 ,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
从文档:
string& append ( const char * s, size_t n );
追加由 s 指向的字符数组中的前 n 个字符形成的字符串的副本。
string& append ( const char * s );
附加由 s 指向的以空字符结尾的字符序列(C 字符串)形成的字符串的副本。此字符序列的长度由第一次出现的空字符确定(由 traits.length(s) 确定)。
第二个版本(您的第一个版本)考虑了空终止符(在您的情况下正是第一个字符)。第一个没有。