程序设计与算法(三)第05周测验001:全面的MyString

这题确实和题目描述的一样,很全面,需要写很多代码,不过和上一周的MyString其实有些相似(所以有些代码直接从上周复制了),如果前面几个星期的题都能自己做出来的话,那么这一题只要仔细分析也没什么太大难度。
但是我写的时候有两个问题,我自己记录一下:
1、我已经不知道多少次把||写成&&了,不知道为什么脑子一直这么不清醒!
2、经常忘记写返回值,尤其是函数返回值是类的引用的时候,这个应该是因为代码写的太少了,而且也没养成好习惯。

#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
{
    char * p;
public:
    MyString(const char * s) {
        if( s) {
            p = new char[strlen(s) + 1];
            strcpy(p,s);
        }
        else
            p = NULL;

    }
    MyString()
    {
        p = new char[1];
		strcpy(p, "");
    }
    ~MyString() { if(p) delete [] p; }
    MyString & operator =(const MyString & m)
    {
        if(p)
            delete [] p;
        if(m.p)
        {
                p=new char[strlen(m.p)+1];
                strcpy(p,m.p);
        }
        else
            p=NULL;
        return *this;
    }
    friend ostream & operator <<(ostream & o,const MyString & m )
    {
        if(m.p)
            cout<<m.p;
        return o;
    }
    MyString(const MyString& s) {
		if (s.p) {
			p = new char[strlen(s.p) + 1];
			strcpy(p, s.p);
		}
		else
			p = NULL;
	}
	friend bool operator <(const MyString &a,const MyString &b)
	{
	    int x=strcmp(a.p,b.p);
	    if(x==-1)
            return 1;
        else
            return 0;
	}

    friend bool operator ==(const MyString &a,const MyString &b)
	{
	    int x=strcmp(a.p,b.p);
	    if(x==1||x==-1)
            return 0;
        else
            return 1;
	}
    friend bool operator >(const MyString &a,const MyString &b)
	{
	    int x=strcmp(a.p,b.p);
	    if(x==1)
            return 1;
        else
            return 0;
	}
	friend MyString operator +(const MyString &a,const MyString & b)
	{
	    MyString ab;
	    ab.p = new char[strlen(a.p)+strlen(b.p) + 1];
        strcpy(ab.p,a.p);
        strcat(ab.p,b.p);
		return ab;
	}
	char & operator [](int i)
	{
	    return p[i];
	}
    MyString & operator +=(const MyString &a)
	{
	    char *s;
	    s=new char[strlen(p)+1];
	    strcpy(s,p);
	    delete [] p;
	    p=new char[strlen(s)+strlen(a.p)+1];
        strcpy(p,s);
        strcat(p,a.p);
        return *this;
	}
    char* operator()(int a, int b)
    {
		char* c = new char[b-a + 2];
		int j = 0;
		for (int i = a; i<a + b; i++, j++) {
			c[j] = p[i];
		}
		c[j] = 0;
		return c;
	}

};


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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值