题目描述
模拟标准库字符串类实现你自己的字符串类。该类需具有构造、字符串连接+、取子串和复制构造、移动构造、复制赋值、移动赋值、输出等功能。要求使用动态分配存储字符串内容。
输入描述
测试程序有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); } } }