文字列のマッチングと置換システム

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); }