文字列のマッチングと置換システム
42959 ワード
同級生のために書いた授業の設計で、時間がありません.マッチングはもちろんKMPで使ったほうがいいですが、残りは何もありません.
#include
#include
#include
#include
#define N 100
#define COUNT 10
void getNext(char * b);
int KMP(char *a,char *b,int start);
int num=0;
int next[N];
char a[N],b[N],c[N],d[N];
int main(){
showtitle();
printf("*** ***
");
int n ;
while(scanf("%d",&n)!=EOF){
switch(n){
case 1:
filemainstring(COUNT);
printf("
*** ***
");
break;
case 2:
filesubstring(COUNT);
printf("
*** ***
");
break;
case 3:
getNext(b);
showNext(b);
printf("
*** ***
");
break;
case 4:
substring(a,b,0);
printf("
*** ***
");
break;
case 5:
printf(" :
");
scanf("%s",b);
getchar();
printf("
");
scanf("%s",c);
replace(a,b,c,0);
printf("
*** ***
");
break;
case 6:
showtitle();
break;
case 7:
printf(" , , ( )
");
n = -1;
break;
default :
printf(" ,
");
break;
}
if(n==-1)
break;
}
return 0;
}
//
void showtitle(){
printf("********************************************************
");
printf("* *
");
printf("********************************************************
");
printf("1. \t\t2.
");
printf("3. next\t\t4. KMP
");
printf("5. \t\t6.
"
"7. ,
");
}
//
void filemainstring(int count){
char str[count][N];
FILE *fp;
if((fp = fopen("D://mainstring.txt","r"))==NULL){
printf("File not open
");
exit(1);
}
for(int i = 0;i<count;i++){
fscanf(fp,"%s
",str[i]);
}
fclose(fp);
printf("
");
for(int i = 0;i<count;i++){
printf("%d.%s
",i+1,str[i]);
}
printf("
");
int n ;
scanf("%d",&n);
int i =0, j=0 ;
strcpy(a,str[n-1]);
printf("
");
}
//
void filesubstring(int count){
char str[count][N];
FILE *fp ;
if((fp = fopen("D://substring.txt","r"))==NULL){
printf("File not open
");
exit(1);
}
for(int i = 0;i<count;i++){
fscanf(fp,"%s
",str[i]);
}
fclose(fp);
printf("
");
for(int i = 0;i<count;i++){
printf("%d.%s
",i+1,str[i]);
}
printf("
");
int n ;
scanf("%d",&n);
int i =0, j=0 ;
strcpy(b,str[n-1]);
printf("
");
}
// next
void getNext(char * b){
int len = strlen(b);
next[0] = -1;
int i =0 ,j =-1;
for(i = 0;i<len;i++){
if(next[i]==-1||b[i]==b[j]){
next[i] = j;
j++;
}else{
j = next[j];
}
}
}
//KMP
int KMP(char *a,char *b,int start){
int len1 = strlen(a);
int len2 = strlen(b);
int i = start,j=0;
while(i<len1&&j<len2){
if(next[j]==-1||a[i]==b[j]){
i++;
j++;
}else{
j = next[j];
}
if(j==len2){
return i-j;
}
}
return -1;
}
//
void substring(char *a,char *b,int start){
getNext(b);
int n = KMP(a,b,start);
if(n==-1){
printf("
");
return ;
}else{
num++;
}
start = n+strlen(b) ;
while(n!=-1&&start<strlen(a)){
n = KMP(a,b,start);
if(n!=-1){
num++;
start = n +strlen(b);
}
}
printf("
");
printf(" %d
",num);
}
// next
void showNext(char *b){
printf("
next :
");
for(int i =0 ;i<strlen(b);i++){
printf("%d ",next[i]);
}
printf("
");
}
//
void replace(char *a,char *b,char*c,int start){
getNext(b);
int n = KMP(a,b,start);
if(n==-1){
printf(" ,
");
return ;
}
int i = 0,j=0;
int len = strlen(c);
while(i<n){
d[j++] = a[i++];
}
strcat(d,c);
j+=len;
start = n+strlen(b) ;
i = start;
while(n!=-1&&start<strlen(a)){
n = KMP(a,b,start);
if(n!=-1){
while(i<n)
d[j++] = a[i++];
strcat(d,c);
j+=len;
start = n +strlen(b);
i = start;
}
}
while(i<=strlen(a)){
d[j++] = a[i++];
}
printf("
: %s
",a);
printf(" : %s
",d);
}