21天學通C++之--String類的設計實現 -开发者知识库

21天學通C++之--String類的設計實現 -开发者知识库,第1张

c 中,自定義構造函數,運算符重載,析構函數,自定義函數,內存分配構成了這門語言知識的半壁江山,這里帶給大家我的c 中string類的實現及要求


題目描述
模擬標准庫字符串類實現你自己的字符串類。該類需具有構造,字符串連接、取子串和復制、賦值、輸出等功能。要求使用動態分配存儲字符串內容。不可使用STL string類


輸入描述
測試程序有4個字符串,每個樣例前兩行含長度不超過200的倆字符串,賦值給前2個字符串對象,后面若干指令,每個指令占一行,分別由指令碼和所需參數組成,空格分隔,每個指令碼具有不同參數和意義; 指令有下述幾種 : 指令P  i代表輸出字符串i; 指令A  i j代表字符串i賦值給字符串j;  指令C i j  k 代表將字符串i和字符串j連接后賦值給字符串k; 指令F i s l k代表從字符串i位置s開始的長度為l的子串賦值給字符串k;所有操作指令和參數肯定是有校的。


輸出描述
每個字符串輸出占1行


輸入樣例
Hello
HDU
P 1
P 2
C 1 2 3
P 3
F 3 5 3 4
P 4


輸出樣例
Hello
HDU
HelloHDU
HDU




#include <iostream>
#include <iomanip>
using namespace std;


class String{
private:
    char *Data;
    int Length;
    
public:
    String();
    String(String &str);
    int GetLength() const;
    int GetStrLength(char* const &str)const;
    bool Resize(int const NewLength);
    String& operator=(char* const &str);
    String& operator=(String const &b);
    String operator (String const &b);
    friend ostream& operator << (ostream& output,String& b);
    String GetSubString(int start,int length);
    ~String();
};


String::String(){
    Data=new char[2];
    Data[0]='\0';
    Length=0;
}


String::String(String &rpl){
    if(!this->Resize(rpl.Length)){
        cout<<"ERR"<<endl;
        return;
    }
    for(int i=0;i<Length;i ){
        this->Data[i]=rpl.Data[i];
    }
    this->Data[Length]='\0';
}


int String::GetLength() const{
    return Length;
}


int String::GetStrLength(char* const &str) const{
    char *tmp = str;
    while (*tmp!='\0')
    {
        tmp ;
    }
    return int(tmp-str);
}


bool String::Resize(int const NewLength){
    if(Data)
        delete[] Data;
    Data=new char[NewLength 1];
    Length=NewLength;
    return true;
}


String& String::operator=(char* const &str){
    if(!this->Resize(this->GetStrLength(str))){
        cout<<"ERR"<<endl;
        return *this;
    }
    for(int i=0;i<Length;i ){
        this->Data[i]=str[i];
    }
    this->Data[Length]='\0';
    return *this;
}


String& String::operator=(String const &b){
    if(!this->Resize(b.Length)){
        cout<<"ERR"<<endl;
        return *this;
    }
    for(int i=0;i<Length;i ){
        this->Data[i]=b.Data[i];
    }
    this->Data[Length]='\0';
    return *this;
}


String String::operator (String const &b){
    String c;
    if(!c.Resize(this->Length b.Length)){
        cout<<"ERR"<<endl;
        return *this;
    }
    for(int i=0;i<this->Length;i ){
        c.Data[i]=this->Data[i];
    }
    for(int i=0;i<b.Length;i ){
        c.Data[c.Length-b.Length i]=b.Data[i];
    }
    c.Data[c.Length]='\0';
    return c;
}


ostream& operator << (ostream& output,String& b){
    if(b.Data!=0)
    output<<b.Data;
    return output;
}


String String::GetSubString(int start, int length){
    String c;
    char* SubString;
    SubString=new char[length 1];
    for(int i=0;i<length;i ){
        SubString[i]=this->Data[start i];
    }
    c=SubString;
    c.Data[length]='\0';
    return c;
}


String::~String(){
    if(Data){
        delete[] Data;
        Data=NULL;
    }
}


int main() {
    char n[201],m[201];
    char comm;
    int i,j,k,l;
    String s[4];
    cin.getline(n,200);
    cin.getline(m,200);
    s[0]=n;
    s[1]=m;
    
    while(cin>>comm){
        switch (comm){
            case 'P':
                cin>>i;
                cout<<s[i-1]<<endl;
                break;
            case 'A':
                cin>>i>>j;
                s[j-1]=s[i-1];
                break;
            case 'C':
                cin>>i>>j>>k;
                s[k-1]=s[i-1] s[j-1];
                break;
            case 'F':
                cin>>i>>j>>k>>l;
                s[l-1]=s[i-1].GetSubString(j, k);
                break;
            default:
                break;
        }
    }
    return 0;
}

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复