请问此C++程序为何无法达到预期效果?

来源:百度知道 编辑:UC知道 时间:2024/06/04 23:06:02
目的是将给定字符串中的标点符号去掉。

#include <iostream>
#include <string>

using namespace std;

int main()
{
string s1;
string s2;

s1="a,b"; //给定字符串

int i = 0;
int j = 0;
while(i < s1.size())
{
while(ispunct(s1[i])) //判断s1[i]是否为标点符号
i++;
s2[j] = s1[i];
i++;
j++;
}

cout << s2 << endl; //希望输出"ab",但是什么也没有输出。
}

s2[j] = s1[i];
这是不行的

c++的问题就是隐藏的东西太多,所以如果你不是对类的内容非常有把握的话尽量按最常见的方式操作。

比如这里 string 的 []运算符, 只能用来存取已经有了的数据。 比如如果你的 s2里放了5字符的字符串, 那就只能用到序号4, 用没有的序号就会挂掉。
像你这里,你是要往里面加东西, 就得用 s2.push_back(s1[i])

首先需要理解string类啊

因为string其实是c++封装的一个类,内部实现的时候
其实是用的一个char * 来实现的;

你定义了一个string s2;
其实就是调用了string 的默认构造函数,那么这个时候 你有了一个string类的对象,而这个对象用一个char * 来保存你的字串,

但是你并没有给string 赋予任何值,那么这个时候char *p=NULL;

也就是说,你在做s2[i]=...的时候,就是对char *p在操作,而这时候该指针还是一个空值,所以说,这样做是不对的

string s2;这里,你没有分配它有多大空间
s2[j] = s1[i];这里就会出错

s1="a,b"; //给定字符串
s2=" ";我在这里加了这一句就是对的

s2[j]=s1[i] 改成 s2+=s1[i] 试试