2 u013182346 u013182346 于 2013.12.25 12:06 提问

范磊c++,在十八章写String类 “重载输入运算符” 遇到问题,请各位大侠帮忙指点!

#include
using namespace std;
class String
{
public:
String();
String(char*);
String(String&);
virtual ~String(){cout<<"析构函数执行\n";delete []str;len=0;}
const int getlen()const{return len;}
friend ostream& operator<<(ostream&o,String &s)
{
o< return o;
}
friend istream& operator>>(istream&i,String &s)
{
i>>s.str;
return i;
}
char &operator;
String & operator=(String&);
String & operator=(char );
private:
int len;
char *str;
};
String::String()
{
cout<<"不带参数的构造函数执行\n";
len=0;
str=new char[1];
str[0]='\0';
}
String::String(char*ch)
{
cout<<"带一个参数的构造函数执行\n";
len=strlen(ch);
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=ch[i];
}
str[len]='\0';
}
String::String(String&s)
{
cout<<"复制构造函数执行\n";
len=s.getlen();
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=s.str[i];
}
str[len]='\0';
}
char &String::operator
{
cout<<"operator[]函数执行\n";
if (len<length)
{
return str[len-1];
}
return str[length];
}
String & String::operator=(String&s)
{
cout<<"operator=函数执行\n";
delete []str;
len=s.getlen();
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=s.str[i];
}
str[len]='\0';
return *this;
}
String & String::operator=(char*ch)
{
cout<<"operator=char函数执行\n";
delete []str;
len=strlen(ch);
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=ch[i];
}
str[len]='\0';
return *this;
}
int main() **strong text
*
{
String s;
cin>>s;
cout<<s<<endl;
cout<<s.getlen()<<endl;
return 0;
}
运行到结尾的时候,输出了我输入的字符,然后输出s.getlen(字符长度)的时候并不是我输入的字符长度,并且程序运行到这里后就崩溃了,当删除掉析构函数里的delete []str以后程序就不会崩溃了,请问是什么原因呢?

2个回答

mevip
mevip   2013.12.25 12:36

1、String s;相当于调用了下面的构造函数
String::String()
{
cout<<"不带参数的构造函数执行\n";
len=0;
str=new char[1];
str[0]='\0';
}

注意:此时,len=0; str只分配了一个字节。

2、cin>>s;会调用下面的函数:
friend istream& operator>>(istream&i,String &s)
{
i>>s.str;
return i;
}
含义是将标准输入(你从键盘输入的内容)写到str指向的内存区域;

3、问题:str实际只分配了一个字节的内存,用于存储字符串结束符(\0),但你从键盘输入的字符串会存入str指向的内存;除非你在输入时直接回车(不输入任何字符),否则内容就会占用str已分配的内存区域后面的内存,导致崩溃。而且不管你输入多少字符,长度输出应该始终是0

4、解决办法:修改friend istream& operator>>(istream&i,String &s),自己考虑吧

u013182346
u013182346 我也感觉问题是出在第4点这里,请问你知道该怎么修改吗?
接近 4 年之前 回复
mevip
mevip   2013.12.26 19:19

给你个思路吧:修改operator>>方法,1)开一个大缓存,保存输入的内容;2)释放str指向的内存;3)按照缓存大小重新给str分配内存;4)将缓存内容拷贝到str中;5)释放缓存

Csdn user default icon
上传中...
上传图片
插入图片