www.pudn.com > chuancaozuo.rar > 2.cpp
#include#include #include template class String { public: String(); // 构造一个空的字符串 String(T *str); //用C++串构造字符串 String(String &ob); //用串对象构造字符串 int Length(); //求字符串的长度 friend int Stringcmp(String &s1,String &s2); //两个字符串的比较 String Substring(int i,int len); //求子串 String Strconcat(String &s1); // 两个字符串的连接 String Destring(int i,int len); //串的删除 friend ostream &operator<<(ostream &stream,String &ob); //串的输出 friend istream &operator>>(istream &stream,String &ob); //串的输入 void Clearstring(); //清空串 int bf_index(const String &T,int pos); int kmp_index(const String &T,int pos); void getnext(const String &T,int *next); private: int length; T *s; }; template String ::String() { length=1; s=new T[length]; if(s==NULL) { cerr<<"分配错误 !"< String ::String(T *str) { int i=0; while(str[i]!='\0') i++; length=i; s=new T[length+1]; if(s==NULL) { cerr<<"分配错误!"< String ::String(String &ob) { length=ob.length; s=new T[length+1]; if(s==NULL) { cerr<<"分配错误!"< } template int String ::Length() { if(!s) throw "字符串不存在!"; return length; } template int Stringcmp(String &s1,String &s2) { for(int i=0;i String String ::Substring(int i,int len) //将串s从i位开始,连续取len位的子串。 { if(i<1 || i>length || len<=0 || len> length-i+1) throw "i不合法!"; String ob; ob.length=len; ob.s=new T[len+1]; for(int j=i;j<=i+len-1;j++) ob.s[j-i]=s[j-1]; ob.s[ob.length]='\0'; return ob; } template String String ::Strconcat(String &s1) { int L;T *s3; L=length+s1.length; s3=new T[L+1]; for(int i=0;i String String ::Destring(int i,int len) { if (i<1 || i>length||len<=0 || len> length-i+1) throw "i或length不合法!"; String ob; ob.length=length-len; ob.s=new T[ob.length+1]; for(int k=0;k<=i-2;k++) ob.s[k]=s[k]; for(int j=i+len-1;j<=length;j++,k++)//从第i+len位开始,到串尾复制到s1串中 ob.s[k]=s[j]; delete []s; return ob; } template ostream &operator<<(ostream &stream,String &ob) //字符串输出流重载 { stream< istream &operator>>(istream &stream,String &ob)//把输入流赋给串对象ob { char c[255]; int len; for(len=0;len<254;len++) { stream.get(c[len]); if(c[len]=='\n')break; if(c[len]=='\b') if(len!=0) { len--; cout<<"'\b'"; } } c[len]='\0'; if(ob.length) { delete ob.s; } ob.s=new char[len+1]; if (ob.s==NULL) { cout<<"分配失败!"< void String ::Clearstring() //清空串 { if(s) {delete [] s;} length=0; } template int String ::bf_index(const String &T,int pos) { if (pos<1||pos>length) throw "pos不合法!"; int i=pos,j=1; while (i<=length && j<=T.length) { if (s[i-1]==T.s[j-1]) { i++; j++; } else { i=i-j+2; j=1;//回溯 } } if(j>T.length) return(i-j+1); else return 0; } template int String ::kmp_index(const String &T,int pos) { int *next=new int[T.length]; getnext(T,next); int i=pos-1,j=0; while(i =T.length) return i-T.length+1; else return 0; } template void String ::getnext(const String &T,int *next) { int i=0,j=-1; next[i]=-1; while(i s1("Hello world!"),s2("eeeewre Hello world!fdf"),s3("I have a dream!"),s4(s2); cout<