帮我看看这个程序吧,好像问题很多呀

来源:互联网 发布:却是石榴知立夏 编辑:程序博客网 时间:2024/04/30 00:46

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>

#define ERROR 0
#define OK 1
#define OVERFLOW -2

typedef int Status;

typedef struct{
  char *ch;
  int length;
}StringType; 

void InitStr(StringType &s);
  // 初始化s为空串。
void StrAssign(StringType &t, char *chars);
  // 将s的值赋给t。s的实际参数是串变量。
int StrCompare(StringType s, StringType t);
  // 比较s和t。若s>t,返回值>0;若s=t,返回值=0; 若s<t,返回值<0。
int StrLength(StringType s);
  // 返回s中的元素个数,即该串的长度。
StringType Concat(StringType &s, StringType t);
  // 返回由s和t联接而成的新串。
StringType SubString(StringType s, int start, int len);
  // 当1<=start<=StrLength(s)且0<=len<=StrLength(s)- start+1时,
  // 返回s中第start个字符起长度为len的子串,否则返回空串。
void Replace(StringType &S, StringType T, StringType V);
/* 以串 v 置换串 s 中出现的所有和串 t 相同的非空串  */ 

// 注意,不要使用 " s = " 的形式为 StringType 类型的变量赋值 ,
// 而要使用 StrAssign 函数!!!

void InitStr(StringType &s)
{
s.ch = (char *)malloc(sizeof(char));
if(!s.ch)exit(OVERFLOW);
s.length = 0;
}

void StrAssign(StringType &t, StringType s)
{
char *p;
int i;
if(t.ch) free(t.ch);
for(i=0, p=s.ch; *p; ++i,++p);
if(!i){t.ch = NULL;t.length = 0;}
else
{
  if(!(t.ch = (char *)malloc(i*sizeof(char))))
    exit(OVERFLOW);
  for(i=0, p=s.ch; *p ; ++i,++p)
   t.ch[i] = s.ch[i];
}   
  t.length = i;
}

int StrCompare(StringType s, StringType t)
{
int i;
s.length = StrLength(s);
t.length = StrLength(t);
for(i=0;i<s.length && i<t.length;++i)
  {if(s.ch[i]!=t.ch[i]) return (s.ch[i]-t.ch[i]);}
 return (s.length-t.length); 
}

int StrLength(StringType s)
{
    int i;
    char *p;
    for(i=0, p=s.ch; *p; ++i,++p);
 s.length = i;
    return s.length;
}

StringType Concat(StringType &t, StringType s1, StringType s2)
{
 char *p,*q;
 int i,j;
    if(t.ch) free(t.ch);
    s1.length = StrLength(s1);
    s2.length = StrLength(s2);
 if(!(t.ch = (char *)malloc((s1.length + s2.length)*sizeof(char))))
  exit(OVERFLOW);
 for(i=0, p=s1.ch; *p ; ++i,++p)
     t.ch[i] = s1.ch[i];
 for( j=0, q=s2.ch; *q;++j,++q)
  t.ch[s1.length+j] = s2.ch[j];
    t.length = s1.length + s2.length;
 return t;
}

StringType SubString(StringType &Sub,StringType s, int start, int len)
  // 当1<=start<=StrLength(s)且0<=len<=StrLength(s)- start+1时,
  // 返回s中第start个字符起长度为len的子串,否则返回空串。
{
 
    s.length = StrLength(s);int i;
    if(start<1 || start>s.length || len<0 || len>s.length-start+1)
    exit(ERROR);
 if(!len){Sub.ch = NULL;Sub.length = 0;}
 else
   {
      if(Sub.ch) free(Sub.ch);
      Sub.ch = (char *)malloc( len* sizeof(char));
   if(!Sub.ch)exit(OVERFLOW);
   for( i=0;i<len;++i)
    Sub.ch[i] = s.ch[start+i-1];
   Sub.length = len;
 }
 return Sub;
}

void Replace(StringType &S, StringType T, StringType V)
/* 以串 v 置换串 s 中出现的所有和串 t 相同的非空串  */
{
 
  StringType t,head,tail,x,y,z;
 
 
  InitStr(t);
  InitStr(head);
  InitStr(tail);
  InitStr(x);
  InitStr(y);
  InitStr(z);
 
   
    int i=1;
   //for(int i=1;i<=StrLength(S)-StrLength(T)+2;++i)
   while(i<=StrLength(S)-StrLength(T)+1)
   {
      SubString(t,S,i,StrLength(T));
   cout<<t.ch<<endl;
   cout<<T.ch<<endl;
         if(StrCompare(t,T)!=0)
   {  cout<<StrCompare(t,T)<<endl;
        ++i;}
          else
         {
            cout<<StrCompare(t,T)<<endl;
            //cout<<t.ch<<endl;
      //cout<<T.ch<<endl;
            cout<<"ssssssssssss"<<endl;
            SubString(x,S,1,i-1);
            StrAssign(head,x);
            SubString(y,S,i+StrLength(T),StrLength(S)-i-StrLength(T)+1);
            StrAssign(tail,y);
            Concat(z,head,V);cout<<z.ch<<endl;
           
            Concat(S,z,tail);cout<<S.ch<<endl;
            //StrAssign(S,);
            //StrAssign(S,);
            i+=StrLength(V);
         }
      } 
}

int main()
{
    StringType r,s,t,T,S,s1,s2,V;
 InitStr(r);InitStr(t);InitStr(s);InitStr(T);InitStr(S);InitStr(s1);InitStr(s2);InitStr(V);
 s.ch="ChinaTown";   
 S.ch="howareyou";
    T.ch="are";
    V.ch="wer";//cout<<t.ch<<endl;
    s1.ch="goodsdfsf";s2.ch="timesdfdsfsafd";//cout<<StrLength(s)<<endl;
    //cout<<s.ch<<endl;
    //cout<<c<<endl;
    //StrAssign(t,s);
    //cout<<t.ch<<endl;
    //cout<<StrCompare(s,t)<<endl;  
    cout<<Concat(r,s1,s2).ch<<endl;
  //for(int i=1;i<StrLength(s)-6;++i)
     //cout<<SubString(t,s ,i ,8).ch<<endl;
     //Replace(S,T,V);
     //cout<<S.ch<<endl;
     getch();
    return 1;
}
真是想破脑胫了

原创粉丝点击