定义一个字符串类

来源:互联网 发布:vb振动电机 编辑:程序博客网 时间:2024/04/29 06:50

我们知道在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的字符复制到schar *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 operatorschar& 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类一样使用啦。

0 0
原创粉丝点击