扩充String类

来源:互联网 发布:如何学好高中数学知乎 编辑:程序博客网 时间:2024/05/23 00:36

前面貌似还有问题。想写重载=赋值后前面崩溃的问题突然消失了。。。。后面结果对了,但是还是不熟练。。追求更简练。。。。思维方式才是王道。。。


再补充一句,重载赋值没写好。。。。

#include<iostream>#include<cmath>#include<cstring>#include<string>using namespace std;class String{public:    String(){len=0;p=NULL;}                       //默认构造函数    String(const char *s);    String(String &str);               //构造函数    ~String(){if(!p)delete []p;}//这个函数要理解。。。。多理解下。。。    void display();//    String& operator=(String &ss);    friend String operator+(String&s1,String&s2);    friend String operator-(String&s1,String&s2);    friend String operator * (String &s1,int n );  //未实现,先发出来了    friend String operator / (String &s1,String &s2 );//未实现,先发出来了private:    char *p;    int len;                                       //字符型指针,用于指向字符串};char* FrontSpace(char*aa){  int len=strlen(aa);  int i=0;//,j=0;  while(aa[i]==' ')i++;//  while(aa[i]!='\0')//  aa[j++]==aa[i++];//  aa[j]='\0';  char*bb=new char[len-i];  strcpy(bb,aa+i);  return bb;}char* BackSpace(char*aa){  int len=strlen(aa);  while(aa[len-1]==' ')len--;  aa[len]='\0';  char*bb=new char[len+1];  strncpy(bb,aa,len);  bb[len]='\0';  return bb;}String::String(const char *s){len=strlen(s);p=new char[len+1];strcpy(p,s);}String::String(String &str){  len=str.len;  p=new char[len+1];  strcpy(p,str.p);}void String::display(){cout<<p<<endl;}//String& String::operator=(String &ss)//{//  len=ss.len;//  p=new char[len+1];//  strcpy(p,ss.p);//  return *this;//}String operator+(String&s1,String&s2){  String nn;  nn.len=s1.len+s2.len;  nn.p=new char[nn.len+1];  strcpy(nn.p,s1.p);  strcpy(nn.p+s1.len," ");  strcpy(nn.p+s1.len+1,s2.p);  return nn;}String operator-(String&s1,String&s2){  s1.p=BackSpace(s1.p);  s1.len=strlen(s1.p);  s2.p=FrontSpace(s2.p);  s2.len=strlen(s2.p);  String nn;  nn.p=new char[s1.len+s2.len+1];  strcpy(nn.p,s1.p);//  strcpy(nn.p+s1.len," ");  strcpy(nn.p+s1.len,s2.p);  return nn;}String operator*(String &s1,int n ){String ss;ss.len=s1.len*n;ss.p=new char[ss.len+1];for(int i=0;i<n;i++)strcpy(ss.p+s1.len*i,s1.p);return ss;}bool Equal(const char *a,const char *b){ if(strlen(b)>strlen(a)) return false; int n=strlen(b); for(int i=0;i<n;i++)if(a[i]!=b[i])      return false; return true;}//char*Delete(char*a,char*b)//{//  int blen=strlen(b);//  char*c=new char[strlen(a)-blen];//  strcpy(c,a+blen);//  return c;//}String operator/(String &s1,String &s2 ){  int m=0;for(int i=0;i<s1.len;i++){if(Equal(s1.p+i,s2.p)){        m++;  int j=i;  int n=strlen(s2.p);  for(;j<s1.len-n;j++)s1.p[j]=s1.p[j+n];        --i;//呵呵,我自己独创的瓦,。或许别人早写过了,但是这里是我自己想到的。。思维的力量哇。。        //为什么要加--i是因为每次检测到相同的时候,后面的字母要前移,但是,i要是保持不动的话,就会错过相同。        //也就是没有这句的话,两个连续的相同是消除不掉的。        s1.p[s1.len-m*n]='\0';      }}return s1;}int main( ){    String string1("Hello     "),string2("   World");    cout<<endl;    String string3;    string3=string1-string2;    string3.display();    string3=string1*8;    string3.display();    String string4("8ololololololololol234ololol5678ololol");    String string5("ol");    string4.display();    string4/string5;    string4.display();    return 0;}





0 0