老是留了个作业,设计一个CString类,可以和字符数组兼容使用,我的代码如下:
头文件cstring1.h内容:
#ifndef _CSTRING1_H
#define _CSTRING1_H
#include
using namespace std;
class Cstring1
{
private:
char* str;
int size;
public:
//Cstring1();
Cstring1(char s=""); // why=""
Cstring1(const Cstring1 &s);
int length(void) const;
Cstring1& SubStr(int pos, int length);
Cstring1& operator=(const Cstring1& s);//Cstring1& operator=(const Cstring1& s)const;这个语句不对
Cstring1& operator=(char*s);
int operator == (const Cstring1& s)const;
int operator == (char*s)const;
friend int equals(char s1, const Cstring1& s);//注意这里的s1 是否要加const修饰
~Cstring1(void);
};
Cstring1::Cstring1(char *s)
{
size=strlen(s)+1;
str=new char[size];
strcpy_s(str,size,s);
}
Cstring1::~Cstring1(void)
{
delete []str;
}
Cstring1::Cstring1(const Cstring1 &s)
{
size=s.size;
str=new char[size];
if(str==NULL) exit(0);
//strcpy(str,s.str);
for(int i=0;i<size;i++)
str[i]=s.str[i];
}
int Cstring1::length() const
{
//return strlen(str);
return size;
}
Cstring1& Cstring1::SubStr(int pos, int length)
{
int charsLeft=size-pos-1;
Cstring1 temp;
char*p,*q;
if(length>charsLeft)
length=charsLeft;
delete []temp.str;
temp.str=new char[length+1];
p=temp.str;
q=&str[pos];
for(int i=0;i<length;i++)
*p++=*q++;
*p=NULL;
temp.size=length+1;
return temp;
}
Cstring1& Cstring1::operator= (char *s)
{
int length=strlen(s);
if(size!=length)
{
delete[]str;
str=new char[length+1];
size=length+1;
}
strcpy_s(str,size,s);
return *this;
}
Cstring1& Cstring1::operator=(const Cstring1 &s)
{
if(size!=s.size)
{
delete []str;
str=new char[s.size];
size=s.size;
}
for(int i=0;i<size;i++)
str[i]=s.str[i];
return *this;
}
int Cstring1::operator ==(char *s) const
{
return (strcmp(str,s)==0);
}
int Cstring1::operator ==(const Cstring1 &s) const
{
return (strcmp(str,s.str)==0);
}
int equals(char* s1, const Cstring1& s)//注意这里的s1 是否要加const修饰
{
return (strcmp(s.str, s1)==0);
}
#endif
以下是主程序内容:
#include "Cstring1.h"
void main()
{
Cstring1 str1("hello,C++");
Cstring1 str2("hello");
Cstring1 str3, str4, str5;
cout<<"计算str1的长度:"<<str1.length()<<endl;
str3 = str1.SubStr(5,9);
str4 = str1.SubStr(5,9);
str5="hello";
if(str3==str4)
cout<<"Cstring1和Cstring1串比较,相等"<<endl;
if(str5=="hello")
cout<<"Cstring1和字符数组的字符串比较,相等"<<endl;
if(equals("hello", str2))
cout<<"字符数组的字符串和Cstring1比较,相等"<<endl;
}
编译可以通过,一运行老是出来一个bad_alloc错误,请大家帮个忙看看,我会给加分的
Cstring1& Cstring1::SubStr(int pos, int length)
{
int charsLeft=size-pos-1;
Cstring1 temp;
char*p,*q;
if(length>charsLeft)
length=charsLeft;
delete []temp.str;
temp.str=new char[length+1];
p=temp.str;
q=&str[pos];
for(int i=0;i<length;i++)
*p++=*q++;
*p=NULL;
temp.size=length+1;
return temp;
}
``
这个函数有问题,它返回了堆栈上变量的地址,但是堆栈上的变量是会被销毁的。`