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<