我有以下代码。
string s1,s2;
cin>>s1;
s2[0] = s1[0];
cout<<s2.length()<<endl;
s2.length()
的输出为零。
我打印时
cout<<s2<<endl;
string s2
的输出是一个空字符串。
但是
cout<<s2[0]<<endl;
它打印一个角色。
我的问题是为什么string s2
为空?
答案 0 :(得分:4)
因为operator[i]假设0<=i<size()
。如果i==size()
行为未定义,则除非您设置s1[0]=std::string::value_type()
。有关详细信息,请参阅提供的链接。
要发现一些运行时错误,请注意您可以使用at()
代替op[]
:
#include <string>
int main()
{
std::string s1;
s1.at(0) = 'A';
}
给出了运行时错误:
terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::at: __n (which is 0) >= this->size() (which is 0) /bin/bash: line 1: 28559 Aborted ./main
答案 1 :(得分:1)
&#34; Picaud Vincent&#34;回应正确。
构建运算符[]以访问字符串索引或写入预分配的字符串内存的指定索引。你不能用operator []来增加字符串的大小。
如果要在字符串末尾添加一些字符,则应使用 + = 等运算符或使用 push_back()方法。
为了澄清,+ = operator或push_back()按顺序执行以下步骤:
1-如果没有足够的空间来添加新字符,请检查字符串内存大小 ,它们扩展了字符串内存
2 - 在当前字符串
的末尾复制新字符3 - 增加字符串长度,
但是operator []只设置了指定索引的值而已,如果你设置了无效索引,你可能会收到访问冲突异常,总结 operator []不会扩展字符串内存或更改字符串长度。