字符串赋值混乱

时间:2018-02-09 05:24:09

标签: c++

我有以下代码。

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为空?

2 个答案:

答案 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 []不会扩展字符串内存或更改字符串长度