019 全面的MyString

#include <cstdlib>
#include <iostream>
using namespace std;
int strlen(const char * s) 
{	int i = 0;
	for(; s[i]; ++i);
	return i;
}
void strcpy(char * d,const char * s)
{
	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
{
public:
    char* mystr = NULL;
    MyString() :mystr(new char[1]) { mystr[0] = 0; } //0 为空NULL
    MyString(const char * ch) {
        if (mystr != NULL) {
            delete[] mystr;
        }
        mystr = new char[strlen(ch) + 1];
        strcpy(mystr, ch);
    }

    MyString(const MyString& str) {

        if (mystr != NULL) {
            delete[] mystr;
        }
        mystr = new char[strlen(str.mystr) + 1];
        strcpy(mystr, str.mystr);
    }

    MyString & operator= (const MyString & nstr) {
        if (mystr != NULL) {
            delete[] mystr;
        }
        mystr = new char[strlen(nstr.mystr) + 1];
        strcpy(mystr, nstr.mystr);
        return *this;
    }
    MyString& operator= (const char * nstr) {
        if (mystr != NULL) {
            delete[] mystr;
        }
        mystr = new char[strlen(nstr) + 1];
        strcpy(mystr, nstr);
        return *this;
    }

    MyString operator+ (const MyString& nstr) {
        MyString ss;
        ss.mystr = new char[strlen(nstr.mystr)+strlen(mystr) + 1];
        strcpy(ss.mystr, mystr);
        strcat(ss.mystr, nstr.mystr);
        return ss;
    }

    MyString operator+ (const char* nstr) {
        MyString ss;

        ss.mystr = new char[strlen(nstr) + strlen(mystr) + 1];
        strcpy(ss.mystr, mystr);
        strcat(ss.mystr, nstr);
        return ss;
    }

    friend MyString operator+ (const char* astr,const MyString& nstr) {
        MyString ss;
        ss.mystr = new char[strlen(nstr.mystr) + strlen(astr) + 1];
        strcpy(ss.mystr, astr);
        strcat(ss.mystr, nstr.mystr);
        return ss;
    }

    MyString & operator+= (const char* nstr) {

        strcat(mystr, nstr);
        return * this;
    }

    char & operator[] (int index) {
        return mystr[index];
    }

    ~MyString() {

        if (mystr != NULL) {
            delete[] mystr;
        }

    }
    char * operator()(int x,int len) {

        static char* res = new char[len];
        for (int i = 0;i < len; ++i) {
            res[i] = mystr[i + x];
        }
        res[len] = '\0';
        return res;
    }
    bool operator<(const MyString & b){
        return mystr[0]<b.mystr[0];
    }

    bool operator>(const MyString & b){
        return mystr[0]>b.mystr[0];
    }

    bool operator== (const MyString & b){
        return mystr[0]==b.mystr[0];
    }

    operator char* () {
        return mystr;
    }

};


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);
	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;
}

posted @ 2022-02-20 22:26  icefield817  阅读(96)  评论(0编辑  收藏  举报