首页 > 代码库 > Automatic Editing UVA 10115

Automatic Editing UVA 10115

#include <stdio.h>
#include <string.h>
#define MAXL 225+5
#define MAXN 10+5

char find[MAXN][MAXL],replace[MAXN][MAXL];
char text[MAXL],convert[MAXL];

int Find(int,int*);
void Replace(int,int);
int str_cmp(int,int);

int main(){
 int N,i,j,k;
 int p;
 
 freopen("data","r",stdin);
 while(scanf("%d\n",&N)&&N){

  for(i=0;i<N;i++){
   gets(find[i]);
   gets(replace[i]);
  }
  gets(text);
  for(i=0;i<N;i++)
  while(Find(i,&p))   //反复查找find,知道text中不存在
   Replace(i,p);      //用replace替代找到的find
  
  printf("%s\n",text);
 }
 
 return 0;
}

int Find(int i,int* p){
 int j;
 for(j=0;j<strlen(text);j++) //查找text中是否有子串find,有则返回初始位置
  if(str_cmp(i,j)){
  *p=j;
  return 1;
  }
 
 return 0;
}

int str_cmp(int i,int j){ //比较函数
 int len=strlen(find[i]);
 int k;

 for(k=0;k<len;k++)
  if(find[i][k]!=text[j+k])
  return 0;

 return 1;
}

void Replace(int i,int p){
 int k,j;

 for(k=0;k<p;k++)//将find子串前的text中的字符放入暂存数组convert
 convert[k]=text[k];
 
 for(j=0;j<strlen(replace[i]);j++,k++)//接着将对应的replace放入
 convert[k]=replace[i][j];

 for(j=p+strlen(find[i]);j<=strlen(text);j++,k++)//放入text中find之后的字符
 convert[k]=text[j];//注意要将最后的'\0'也放入

 for(k=0;k<=strlen(convert);k++)//最后将convert复制回text,注意'\0'
 text[k]=convert[k];
}