定义一个字符串类

我们知道在C++里不同于C,对于字符串如何表示有两种方式:

一种是把字符串作为字符数组来处理,即基于指针的字符串或称作C字符串:arr[]="city is good" 或者*arr={'c','i','t','y','\0'};

一种是C++库里面提供的string类,可以利用它创建字符串,利用成员函数进行字符串,但是C++库只给出相应接口,如何实行已经封装好。为此我们可以不厌其烦研究如何实现即自定义一个字符串类mystr,用来存放不定长的字符串,重载运算符“< =”、“[]”和“>>”、“<<”、“+”。

class mystr{
		private:
			char *str;
		public:
			mystr(){str=NULL;}
			mystr(char *chars){int size=strlen(chars);str=new char[size+1];strcpy(str,chars);}
			mystr(char chars[],int size){str=new char[size+1];strncpy(str,chars,size);}
			/*~mystr(){delete str;}*/
			mystr append(mystr s){return strcat(str,s.getchar());}
			mystr append(mystr s,int index,int x){
			char *temp=new char [x+1];
			for(int i=0;i<x;i++)
				temp[i]=s.getchar()[index+i];
			temp[x]='\0';
			return strcat(str,temp);}//将s从Index开始的n个字符追加到当前字符串后
			mystr assign(char chars[]){
			int size=strlen(chars);
			str=new char[size+1];
			str[size]='\0';
			return strcpy(str,chars);}//将一个字符数组赋予当前字符串
			mystr assign(mystr s,int index,int n){
			char *temp=new char [n+1];
			for(int i=0;i<n;i++)
				temp[i]=s.getchar()[index+i];
			temp[n]='\0';
			return assign(temp);}
			char at(int index){
				int size=this->getsize();
			for(int i=0;i<size;i++)
			  if(i==index) return str[i];
			{cout<<"no char!"<<endl;
			exit(0);}}//返回当前字符串中index处值
			int length(){
				return this->getsize();}//返回当前字符串长度
			void clear(){
				if(this->getsize()==0) return ;
				else {for(int i=0;i<this->getsize();i++)
				           str[i]='\0';}}//清除当前字符串所有字符
			mystr erase(int index,int n){
				if(this->getsize()<n) {cout<<"error of numbers";exit(0);}
				int size=this->getsize()-n;
				char *temp=new char[size+1];
				temp[size]='\0';
			for(int i=0;i<index;i++)
			     temp[i]=str[i];
			for(int i=index;i<size;i++)
				temp[i]=str[n+i];
			return temp;}//清除当前字符串从index开始的n个字符
			bool empty(){
				if(this->getsize()==0)  return true;
				else return false;}//判断是否为空
			int com(mystr s){
				return strcmp(str,s.getchar());}//比较两个字符串
			void copy(char s[],int index,int n){
			char *temp=new char [n+1];
			for(int i=0;i<n;i++)
				temp[i]=this->getchar()[index+i];
			temp[n]='\0';
			strcpy(s,temp);}//将当前字符串从index开始的n的字符复制到s
			char *data(){
			return str;}//将当前字符串以字符数组形式返回
			mystr substr(int index,int n){
			char *temp=new char [n+1];
			for(int i=0;i<n;i++)
				temp[i]=this->getchar()[index+i];
			temp[n]='\0';
			return temp;}//返回当前字符串index开始的n个子字符串
			void swap(mystr& s){
				char *temp=new char [s.getsize()];
				char *temp1=new char[this->getsize()];
				temp=s.getchar();
				temp1=this->getchar();
				this->assign(temp);
				s.assign(temp1);
				
			}//交换s以及当前字符串内容
			int find(char ch){
				for(int i=0;i<this->getsize();i++)
					if(ch==str[i])  {return i;break;}
			return -1;}//返回当前字符串第一次出现ch的位置
		char *getchar(){return str;}
		int getsize(){return strlen(str);}
		
		//overload operators
		char& operator[](int x){
			if(x>=this->getsize()) {cout<<"over the size";exit(0);}
		return str[x];}//overload []
		mystr operator+(mystr &s){
			return this->append(s);}//overload +
		bool operator<=(mystr &s){
			if(this->com(s)<=0) return true;
			else return false;}//overload <=
		mystr operator+=(mystr &s){
			*this=(*this)+append(s);
		return *this;}//overload +=
		friend ostream&operator<<(ostream&out,mystr &s);
		friend istream&operator>>(istream&in,mystr &s);//overload <<,>>
};



		ostream&operator<<(ostream&out,mystr &s){
			out<<s.getchar();
		return out;}
		istream&operator>>(istream&in,mystr &s){
			in>>s.str;
		return in;}//友元函数必须声明与定义分开


当一个头文件包含此类时候,就可以相当c++类库里面的string类一样使用啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值