string[x]作为左值问题
#include <iostream>
#include <string>
using namespace std;
void main()
{
string s1,s2;
cout < < "请输入包含标点符号的字符串: " < <endl;
getline(cin,s1);
cout < < "s1= " < <s1 < <endl;
for(string::size_type index1=0,index2=0;index1 <s1.size();index1++,index2++)
if(ispunct(s1[index1]))
index1++;
else
s2[index2]=s1[index1];
cout < < "s2= " < <s2 < <endl;
}
程序报错:内存不可written。但是s2[index2]=s1[index1];如果改为s2+=s1[index1]就能正常了。是不是左值问题。
查看了书籍如下:
变量是左值(2.3.1 节),且赋值操作的左操作的必须是左值。和变量一样,string 对象的下标操作返回值也是左值。因此,下标操作可以放于赋值操作符的左边或右边。通过下面循环把 str 对象的每一个字符置为 ‘*’:
for (string::size_type ix = 0; ix != str.size(); ++ix)
str[ix] = '* ';
[解决办法]
s2[index2]是获取字符串s2中位置为index2的那个char的引用。而实际上s2的长度一直为0,这个char不存在,所以就出错了。