PSVM_KEN 2020-04-20 18:12 采纳率: 0%
浏览 396

为啥在DEVC++能运行,VS2019却报错?(来源poj北大郭炜老师:全面的MyString)

#include
#include
using namespace std;
int strlen(const char * s) //求长度
{ int i = 0;
for(; s[i]; ++i);
return i;
}
void strcpy(char * d,const char * s) //复制字符串并将最后一个字符变成‘\0’
{
int i = 0;
for( i = 0; s[i]; ++i)
d[i] = s[i];
d[i] = 0;

}
int strcmp(const char * s1,const char * s2) //比较较短长度中每个字符大小
{
for(int i = 0; s1[i] && s2[i] ; ++i) {
if( s1[i] < s2[i] )
return -1;
else if( s1[i] > s2[i])
return 1;
}
return 0;
}
void strcat(char * d,const char * s) //连接字符串
{
int len = strlen(d);
strcpy(d+len,s);
}
class MyString
{
// 在此处补充你的代码
char *ptr;
public:
MyString(char *p){
ptr = new char[strlen(p)+1];
strcpy(ptr,p);
}
MyString(){ //数组不要定义为NULL
ptr = new char[2];
ptr[0] = 0;
}
MyString (const MyString &r){
if(r.ptr==NULL) return;
// if(ptr) delete []ptr;
ptr = new char[strlen(r.ptr)+1];
strcpy(ptr,r.ptr);
}
MyString & operator =(char *p){
if(ptr) delete []ptr;
ptr = new char[strlen(p)+1];
strcpy(ptr,p);
return *this;
}
friend ostream & operator <<( ostream &os,const MyString &r){
os<<r.ptr;
return os;
}
MyString & operator =(const MyString &r){
if(ptr==r.ptr) return *this;
if(ptr) delete []ptr;
ptr = new char[strlen(r.ptr)+1];
strcpy(ptr,r.ptr);
return *this;
}
MyString operator +(const MyString &r){ //不加const 会报错
char *tmp = new char[strlen(ptr)+strlen(r.ptr)+2]; //strlen()不包括'\0',但strcat()和strcpy()包括'\0'
strcpy(tmp,ptr);
strcat(tmp,r.ptr);
MyString t(tmp);
delete []tmp;
return t;
}
char & operator {
return ptr[i];
}
MyString & operator +=(const char *p){
char *tmp = new char[strlen(ptr)+strlen(p)+2];
strcpy(tmp,ptr);
strcat(tmp,p);
delete []ptr;
ptr = tmp;
return *this;
}
friend MyString operator +(const char *p,const MyString &r){
char *tp = new char[strlen(p)+strlen(r.ptr)+2];
strcpy(tp,p);
strcat(tp,r.ptr);
MyString tmp(tp);
delete []tp;
return tmp;
}

    MyString operator ()(int start,int len){
        char *p = new char[len+1];
        for(int i=0;i<len;++i)
           p[i] = ptr[i+start];
           p[len] = 0;
        MyString tmp(p);
        delete []p;
        return tmp;
    }
    friend bool operator <(const MyString &r1,const MyString &r2){
        return strcmp(r1.ptr,r2.ptr) <0;
    }
    friend bool operator >(const MyString &r1,const MyString &r2){
        return strcmp(r1.ptr,r2.ptr) >0;
    }
    friend bool operator ==(const MyString &r1,const MyString &r2){
        return strcmp(r1.ptr,r2.ptr) ==0;
    }

    ~MyString(){
        if(ptr) delete []ptr;
    }

};

int CompareString( const void * e1, const void * e2) //比较字符串大小
{
MyString * s1 = (MyString * ) e1;
MyString * s2 = (MyString * ) e2;
if( * s1 < *s2 ) //重载< > ==
return -1;
else if( *s1 == *s2)
return 0;
else if( *s1 > *s2 )
return 1;
}
int main()
{
MyString s1("abcd-"),s2,s3("efgh-"),s4(s1); //构造函数、复制构造函数
MyString SArray[4] = {"big","me","about","take"}; //“=”重载(字符换和对象)
cout << "1. " << s1 << s2 << s3<< s4<< endl; //“<<”重载
s4 = s3; //“=”重载 (对象与对象)
s3 = s1 + s3; //“+”重载
cout << "2. " << s1 << endl;
cout << "3. " << s2 << endl;
cout << "4. " << s3 << endl;
cout << "5. " << s4 << endl;
cout << "6. " << s1[2] << endl; //“[]”重载
s2 = s1;
s1 = "ijkl-";
s1[2] = 'A' ;
cout << "7. " << s2 << endl;
cout << "8. " << s1 << endl;
s1 += "mnop"; //“+=”重载
cout << "9. " << s1 << endl;
s4 = "qrst-" + s2; //"+"重载
cout << "10. " << s4 << endl;
s1 = s2 + s4 + " uvw " + "xyz";
cout << "11. " << s1 << endl;
qsort(SArray,4,sizeof(MyString),CompareString); //qsort函数 ->系统自带
for( int i = 0;i < 4;i ++ )
cout << SArray[i] << endl;
//s1的从下标0开始长度为4的子串
cout << s1(0,4) << endl; //()的重载
//s1的从下标5开始长度为10的子串
cout << s1(5,10) << endl;
return 0;
}


  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-07-25 14:03
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:请说明代码中`MyString`这个类的功能和实现逻辑。 回答:
    1. MyString类的功能:MyString类是一个自定义的字符串类,提供了字符串的各种操作,包括构造函数、复制构造函数、赋值运算符重载、连接字符串、取下标、字符串拼接、子串截取、比较大小等功能。
    2. MyString类的实现逻辑:该类使用char*类型的指针ptr来存储字符串数据,通过动态内存分配存储字符串。在构造函数、赋值运算符重载、拷贝构造函数等方法中,使用strlen函数来获取字符串长度,使用strcpystrcat函数来进行字符串复制和连接。同时,还重载了<,>,==等运算符来方便比较字符串大小。在类的最后使用了析构函数来释放动态分配的内存。
    3. 示例代码:
    MyString s1("abcd-"), s2, s3("efgh-"), s4(s1); // 构造函数、复制构造函数
    s2 = "ijkl-"; // 赋值给s2
    s3 = s1 + s2; // 字符串连接
    cout << s3 << endl; // 输出字符串s3
    if (s3 > s4) {
        cout << "s3 is greater than s4" << endl;
    }
    MyString s5 = s3(1, 3); // 截取子串
    cout << s5 << endl; // 输出子串
    MyString arr[] = {s1, s2, s3, s4}; 
    qsort(arr, 4, sizeof(MyString), CompareString); // 使用CompareString函数比较字符串大小,并对数组进行排序
    
    评论

报告相同问题?