字符串编程,将字符串S中出现的子串T1用字符串T2替代。

类别:软件工程 点击:0 评论:0 推荐:

/*字符串编程,将字符串S中出现的子串T1用字符串T2替代

ahebhechedhe

he

hello!

ahello!bhello!chello!dhello!

*/

/*静态数组实现*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN + 1];
typedef int Status;

void StrAssign(SString &S,char *chars)
{//串赋值
 int length = 0;
 unsigned char * Sclient = S + 1;

 while(*(chars))
 {
  *Sclient = *chars;
  chars++;
  Sclient++;
  length++;
 }
 *Sclient  = '\0';
    S[0] = length;
}

void Display_String(SString S)
{//串显示
 cout<<S + 1<<endl; 
}

int Index(SString S, SString T, int Pos)
{//在串S中扫描子串T的位置值,如不存在子串T返回0
 unsigned char *Sclient = S + 1;
 int clientLen = 0;

 if (Pos > S[0])
  return -1;
 T++;
 while (*(Sclient))
 {
  while(*(T) == *(Sclient + Pos))
  {
   T++;
   if (!*T)
    return Pos;
   clientLen++;
   Sclient++;
   
  }
  
  Sclient = Sclient - clientLen;
  Pos++;
 }
 return -1;
}
void Delete(SString &S, int pos, int len)
{//在串S中删去从pos位置开始的len个字符
 S[0] -= len;
 unsigned char * Sclient = S + 1;

 while (*(Sclient + len + pos))
 {
  *(Sclient + pos) = *(Sclient + pos +len);
  Sclient++;
 }
 *(Sclient + pos) = '\0';
 
}


void Insert(SString &S,int &pos,SString T)
{//在串S的pos位置插入子串T
 int i;

 if(pos  != S[0])
 {
  for (i = 0; i < S[0] - pos; i++)
  {
   *(S + S[0] + T[0] - i) = *(S + S[0] - i);
  }  
 }
  
 for(i = 0; i < T[0]; i++)
 {
  S[pos + i + 1] = T[i + 1];
 }
 S[0] += T[0];
 *(S + S[0] + 1) = '\0';
 pos += T[0];
}

void Replace_SubString(SString &S, SString T1, SString T2)
{//通过对Index、Delete和Insert函数的调用,完成将串S中出现的子串T1用串T2替代
 int pos = 0;
 int posFlag = -1;
 
 while (1)
 {
  pos = Index(S, T1, pos);
  
  if (pos < posFlag)
   break;
  posFlag = pos;
  
  Delete(S, pos, T1[0]);
  Insert(S, pos, T2);
 }
}


void main( void )
{
 SString S, T1,T2;

 StrAssign(S, "ahebhechedhe");
 
 Display_String(S);
 
 StrAssign(T1,"he");
 
 Display_String(T1);
 
 StrAssign(T2,"HELLO!");
 
 Display_String(T2);

 Replace_SubString(S,T1,T2);
 
 Display_String(S);
}


/*用动态链表实现:*/
#include <stdio.h>
#include <stdlib.h>

#define MAXSTRLEN 255

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

void StrAssign(HString &S, char *chars)
{
 //串赋值
 char*  c;
 int    i, j;

 if (!S.ch)
  free(S.ch);

 for (i = 0, c = chars; *c; c++, i++ );

 if (!i)
 {
  S.ch = NULL;
  S.length = 0;
 }
 else
 {
  if (!(S.ch = (char*)(malloc(sizeof(char) * i))))
   return;
  
  for (j = 0; j < i; j++)
   S.ch[j] = chars[j];
 }
 S.length = i;
 
}

void Display_String(HString S)
{//串显示
 if (S.ch == NULL)
  return;
 int i;
 for(i = 0; i < S.length; i++)
  printf("%c", S.ch[i]);
 printf("\n");
}

int Index(HString S, HString T,int Pos)
{//在串S中扫描子串T的位置值,如不存在子串T返回0
 int clientLen = 0;
 char * Tclient = T.ch;
 
 if (Pos >= S.length)
  return -1;
 char * Sclient = S.ch;
 while ((Sclient - S.ch) <= S.length)
 {
  while(*(Tclient) == *(Sclient + Pos))
  {
   if ((Tclient - T.ch) < S.length)
    return Pos;
   Tclient++;
   clientLen++;
   Sclient++; 
  }
  Sclient = Sclient - clientLen;
  Pos++;
 }
 
 return -1;
}
void Delete(HString &S,int pos,int len)
{//在串S中删去从pos位置开始的len个字符
 int i;

 for (i = 0; i < (S.length - pos); i++)
  S.ch[pos + i] = S.ch[pos + i + len];
 S.length -= len;
}

void Insert(HString &S,int &pos,HString T)
{//在串S的pos位置插入子串T
 S.ch = (char *)realloc(S.ch, T.length + S.length);
 S.length += T.length;
 int i;
 
 if(pos  != S.length)
 {
  
  for (i = 0; i < S.length - pos; i++)
  {
   *(S.ch + S.length + T.length-1 - i) = *(S.ch + S.length -1- i);
  }  
 }
 
 for(i = 0; i < T.length; i++)
 {
  S.ch[pos + i] = T.ch[i];
 }
 pos += T.length;
 
}

void Replace_SubString(HString &S, HString T1,HString T2)
{// 通过对Index、Delete和Insert函数的调用,完成将串S中出现的子串T1用串T2替代
 int pos = 0;
 int posFlag = -1;
 
 while (1)
 {
  pos = Index(S, T1, pos);
  
  if (pos < posFlag)
   break;
  posFlag = pos;
  
  Delete(S, pos, T1.length);
  Insert(S, pos, T2);
 }
 
}


void main()
{
 HString S, T1, T2;

 StrAssign(S, "ahebhechedhe");
 
 Display_String(S);
 
 StrAssign(T1, "he");
 
 Display_String(T1);
 
 StrAssign(T2, "hello!");
 
 Display_String(T2);
       
 Replace_SubString(S,T1,T2);
 
 Display_String(S);
}

本文地址:http://com.8s8s.com/it/it34781.htm