题目描述

模拟标准库字符串类实现你自己的字符串类。该类需具有构造、字符串连接+、取子串和复制构造、移动构造、复制赋值、移动赋值、输出等功能。要求使用动态分配存储字符串内容。

输入描述

测试程序有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
网址:http://virlab.hdu.edu.cn/assignment/programList.jsp?proNum=1&courseID=4&assignID=55

题解:
简单的语法练习题。
可以自行扩展一下,比如说实现stl中string的所有操作,加深理解,由于时间原因只多加了个resize()。
注意样例中只有3个操作,而题目要求了4个。

以下是代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define me(a,b) memset(a,b,sizeof(a))
#define N 101
typedef long long ll;
using namespace std;

class mystring
{
private:
      char*s;
      int l;
      int size;
public:
      //构造
      mystring()//普通构造
      {
            s=NULL;
            l=0;
            size=0;
      }
      mystring(char *a);
      mystring(mystring&a);
      mystring(mystring&&a);
      ~mystring()
      {
            delete[] s;
      }

      //运算符重载
      mystring&operator=(char*a);
      mystring&operator=(mystring&a);
      mystring&operator=(mystring&&a);
      friend mystring operator+(mystring&a,mystring&b);

      //功能
      void show();
      friend mystring sub(mystring&a,int s,int l);
      void resize(int n);//重新分配内存(当已申请的内存不够用时,参考stl的string)

/*

*/
}s[4];

//构造
mystring::mystring(char*a)
{
      this->s=NULL;
      (*this)=a;//使用重载的=号构造
}
mystring::mystring(mystring&a)
{
      this->s=NULL;
      (*this)=a;//使用重载的=号构造
}
mystring::mystring(mystring&&a)
{
      l=a.l;
      size=a.size;
      delete[]s;//防止内存泄漏
      s=a.s;
      a.s=NULL;
}


//重载
mystring& mystring::operator=(char*a)
{
      l=strlen(a);
      size=l+10;
      delete[]s;//防止内存泄漏
      s=new char[size];
      for(int i=0;i<l;i++)
            s[i]=a[i];
      return(*this);
}
mystring& mystring::operator=(mystring&a)
{
      l=a.l;
      size=a.size;
      delete[]s;//防止内存泄漏
      s=new char[size];
      for(int i=0;i<l;i++)
            s[i]=a.s[i];
      return(*this);
}
mystring& mystring::operator=(mystring&&a)
{
      l=a.l;
      size=a.size;
      delete[]s;//防止内存泄漏
      s=a.s;
      a.s=NULL;
      return(*this);
}
mystring operator+(mystring&a,mystring&b)
{
      mystring tmp;
      tmp.l=a.l+b.l;
      tmp.size=tmp.l+10;
      tmp.s=new char[tmp.size];
      for(int i=0;i<a.l;i++)
      {
            tmp.s[i]=a.s[i];
      }
      for(int i=a.l;i<tmp.l;i++)
      {
            tmp.s[i]=b.s[i-a.l];
      }
      return tmp;
}

//操作
void mystring::show()
{
      for(int i=0;i<l;i++)
      {
            cout<<s[i];
      }
      cout<<endl;
}
void mystring::resize(int n)
{
      this->size=n;
      char *tmp=new char[n];
      for(int i=0;i<this->l;i++)
            tmp[i]=this->s[i];
      delete[]s;
      s=tmp;
      tmp=NULL;
}
mystring sub(mystring&a,int s,int l)
{
      mystring tmp;
      tmp.l=l;
      tmp.size=tmp.l+10;
      tmp.s=new char[tmp.size];
      for(int i=0;i<l;i++)
      {
            tmp.s[i]=a.s[i+s];
      }
      return tmp;
}

int main()
{
      //freopen("in.txt","r",stdin);
      char a[200],ch;
      int q,w,e,r;
      cin>>a;
      s[0]=a;
      cin>>a;
      s[1]=a;
      while(cin>>ch)
      {
            if(ch=='P')
            {
                  cin>>q;
                  s[q-1].show();
            }
            else if(ch=='C')
            {
                  cin>>q>>w>>e;
                  s[e-1]=s[q-1]+s[w-1];
            }
            else if(ch=='A')
            {
                  cin>>q>>w;
                  s[w-1]=s[q-1];
            }
            else if(ch=='F')
            {
                  cin>>q>>w>>e>>r;
                  s[r-1]=sub(s[q-1],w,e);
            }

      }
}

 

posted on 2019-04-19 00:10  这个昵称被使用了吗  阅读(317)  评论(0编辑  收藏  举报