我们知道在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类一样使用啦。