要写string类,完成运算符+-,不能用<cstring>我写完了,但是具体的问题不知道怎么解决求高手帮帮忙 5

#include<iostream>usingnamespacestd;classString{public:String(char*str);//基本构造函数intst... #include <iostream>
using namespace std;

class String{
public:

String(char *str);//基本构造函数
int strlen(char *str);//长度函数
int strcmp(char*str1, char*str2);//比较函数
char strcpy(char *str1, char *str2);//覆盖置值函数
String(const char*);//利用const来初始化
String(const String&);//拷贝构造函数
String operator=(String &str2);//运算符重载等号,实现赋值函数
friend String operator+(String &str1,String &str2);//运算符重载加减,实现字符串的连接和删减功能
friend String operator-(String &str1,String &str2);

friend istream& operator>>(istream& in,String&);//声明友元函数输入输出流
friend ostream& operator<<(ostream& out,String&);

~String();//析构函数

private:
char *data;
};

String::String(char *str)//类似平常类的Set函数,构造函数
{
if(str==NULL)
{
data=new char[1];//如果str指向的是空地址,则对data分配一新地址
data[0]='\0';//并且在首地址放置结束符'/0'
}
else
int lenth=strlen(str);
data=new char[lenth+1];
strcpy(data,str);//如果不是则表明要用str做初值赋给data

}

String::String(const String& str2)//拷贝构造函数
{
int lenth=strlen(str2.data);
data=new char[lenth+1];
strcpy(data,str2.data);
cout<<"调用了拷贝构造函数"<<endl;

}

String::~String()//析构函数,释放空间
{
delete[]data;
}

String::strlen(char *str)
{
char *p=str;
while(*p) //从str的首地址一直指到str结尾的\0
++p;
return p-str; //相对位置求出字符串str的长度
}

String::strcpy(char *str1, char *str2)
{
while((*str2)!='\0')
*(str1++)=*(str2++);//覆盖赋值
*str1='\0';//添加结束符
return str1;
}

String operator+(String &str1,String &str2)
{
int i=0,k=0;
while(str1[i]) i++;//从开始到最后,制造连接点
while(str2[k]) str1[i++]=str2[k++];
str1[i]='\0';
return str1;

}

String::strcmp(char*str1, char*str2)
{
while(*str1 && *str2)
{
if(*str1>*str2) return 1;
if(*str1<*str2) return -1;
str1++;
str2++;
}

String::String operator=(String &str2)
{
int lenth=strlen(str2.data);
data=new char[lenth+1];
strcpyy(data,str2.data);
}

istream& operator>>(istream& in,String& str);//声明友元函数输入输出流
{
in>>str.data;
return in;
}

ostream& operator<<(ostream& out,String& str);
{
out<<str.data;
return out;
}

int main()
{
String str1,str2,str3;
char symbol;
cout<<"please input +-"<<endl;
cin>>symbol;//利用switch做外包装
switch(symbol)
{
case'+': str3=str1+str2; cout<<"sum="<<str3<<endl;break;
case'-': str3=str1-str2; cout<<"sub="<<str3<<endl;break;
default: cout<<"error! please choose exactly..."<<endl;
}
return 0;
}
展开
 我来答
chinaray79
2012-06-03 · TA获得超过178个赞
知道答主
回答量:113
采纳率:0%
帮助的人:112万
展开全部
错误处在于, 动态分配的内容长度。
strcpy及+重载都需要再重新分配总长度的内存。当然,还需要保留旧的地址以便复制和最后删除。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式