64,636
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
class mystring
{
public:
mystring();
mystring(char *a);
mystring(mystring &s);
~mystring();
char * strcopy(char *stra);
mystring & operator =(mystring &st);
mystring operator+(mystring &st);
int strlength();
int strch(mystring a);
void showopr();
public:
int length;
char *str1;
};
mystring::mystring()
{
cout<<"constract mysring"<<endl;
length=0;
str1=new char[1];
}
mystring::mystring(char *a)
{
char *ww=a;
cout<<"construct mystring 2"<<endl;
int n=0;
while (*(ww++) != '\0')
{
n++;
}
length=n;
str1 =new char[length+1];
strcopy(a);
}
mystring::mystring(mystring &s)
{
if(s.str1)
{
cout<<"constrct3"<<endl;
length=s.length;
str1=new char[length+1];
strcopy(s.str1);
}
else
{
cout<<"error";
}
}
mystring::~mystring()
{
cout<<"deleteing"<<endl;
delete []str1;
cout<<"deleteing str1"<<endl;
}
mystring & mystring::operator=(mystring &st)
{
if(str1)
{
delete []str1;
}
length=st.length;
str1=new char[length+1];
str1=strcopy(st.str1);
cout<<"------"<<str1<<"-----"<<endl;
return *this;
}
mystring mystring:: operator+(mystring &st)
{
int i;
mystring aa;
aa.length=st.length+length;
aa.str1=new char[aa.length+1];
for( i=0;i<aa.length;i++)
{
if(*str1!='\0')
{
*(aa.str1+i)=*(str1++);
}
else
{
*(aa.str1+i)=*(st.str1++);
}
}
*(aa.str1+i)='\0';
cout<<"======"<<aa.str1<<"======="<<endl;
return aa;
}
//实现strcopy等函数不在调用string类情况下,实现
char * mystring::strcopy(char *stra)
{
char *stt=stra;
char *address=str1;
if ((stra == NULL) || (str1 == NULL))
{
cout<<"字符串错误";
}
while ((*address++ = *stt++) != '\0')
;
return str1;
}
//求字符串长度
int mystring::strlength()
{
int ss=0;
char *strb=str1;
if (*strb==NULL)
{
cout<<"error!"<<endl;
}
while ((*strb++) != '\0')
{
ss++;
}
return ss;
}
//求子串,这自己编写的,还可以参考数据结构的那个,思想一样
int mystring::strch(mystring a)
{
int i,j;
char *ss=a.str1;
char *gg=this->str1;
char *ii=this->str1;//增加两个指针,都是指向主串的位置,
for(i=0;i<=(this->length - a.length);gg=++ii,++i)
{
for(j=0,ss=a.str1;j<a.length;j++)
{
if(*gg==*ss)
{
gg++;
ss++;
}
else
{
break;
}
}
if(j==a.length)
{
return i+1;
}
}
return -1;
}
void mystring::showopr()
{
cout<<str1<<endl;
}
int main()
{
char aa[100];
char ee[100];
cout<<"请输入字符串:"<<endl;
cin>>aa;
mystring str(aa),ss;
ss=str;
ss.showopr();
cout<<"请第二个输入字符串:"<<endl;
cin>>ee;
mystring str2(ee),s1;
s1=str2+str;
s1.showopr();
return 0;
}
mystring mystring:: operator+(mystring &st)
{
int i;
mystring aa;
char *tempthis=str1,*tempst=st.str1;//改动的地方
aa.length=st.length+length;
aa.str1=new char[aa.length+1];
for( i=0;i<aa.length;i++)
{
if(*str1!='\0')
{
*(aa.str1+i)=*(tempthis++);//改动的地方
}
else
{
*(aa.str1+i)=*(tempst++);//改动的地方
}
}
*(aa.str1+i)='\0';
cout<<"======"<<aa.str1<<"======="<<endl;
return aa;
}
mystring & mystring::operator=(const mystring &st)
{
if (this != &st)
{
delete []str1;
str1 = new char[st.length + 1];
strcopy(st.str1);
}
cout<<"------"<<str1<<"-----"<<endl;
return *this;
}
mystring mystring:: operator+(const mystring &st)
{
char *tmp = new char[st.length + length + 1];
strcpy(tmp, str1);
strcpy(tmp + length, st.str1);
cout<<"======"<<tmp<<"======="<<endl;
return mystring(tmp);
}
mystring::mystring()
{
cout<<"constract mysring"<<endl;
length=0;
str1=new char[1];
*str1 = 0;//这里
}
mystring::mystring(char *a)//这里应该是const char *a;
{
char *ww=a;//所以这里也应该是const char *ww = a;
cout<<"construct mystring 2"<<endl;
int n=0;
while (*(ww++) != '\0')
{
n++;
}
length=n;
str1 =new char[length+1];
strcopy(a);
}
mystring::mystring(mystring &s)//这里最好改为const mystring &s;
{
if(s.str1)//这里的判断就没有必要了,
{
cout<<"constrct3"<<endl;
length=s.length;
str1=new char[length+1];
strcopy(s.str1);
}
else
{
cout<<"error";
}
}
mystring & mystring::operator=(mystring &st)//这里最好是const mystring &st
{
//应该加上if (this == &s)的判断
if(str1)//同样这里的判断也没必要,
{
delete []str1;
}
length=st.length;
str1=new char[length+1];
str1=strcopy(st.str1);
cout<<"------"<<str1<<"-----"<<endl;
return *this;
}
mystring mystring:: operator+(mystring &st)//const mystring &st
{
int i;
mystring aa;//其实这里没必要创建一个这样的缺省对象的
aa.length=st.length+length;
aa.str1=new char[aa.length+1];//这里就泄露了啊,str1没有释放
for( i=0;i<aa.length;i++)
{
if(*str1!='\0')
{
*(aa.str1+i)=*(str1++);
}
else
{
*(aa.str1+i)=*(st.str1++);
}
}
*(aa.str1+i)='\0';
cout<<"======"<<aa.str1<<"======="<<endl;
return aa;
}