对字符串进行匹配和替换系统

这是一个关于课程设计的项目,主要介绍了如何运用KMP算法进行字符串匹配。在这个系统中,KMP算法因其高效性被选择用于实现字符串的匹配操作。
摘要由CSDN通过智能技术生成

帮同学写的一个课程设计,没时间了。
匹配当然是用KMP最好使了,其余的没什么了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#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("***请选择指令***\n");
     int n ;
     while(scanf("%d",&n)!=EOF){

        switch(n){

        case 1:
            filemainstring(COUNT);
            printf("\n***请选择指令***\n");
            break;
        case 2:
            filesubstring(COUNT);
            printf("\n***请选择指令***\n");
            break;
        case 3:
            getNext(b);
            showNext(b);
            printf("\n***请选择指令***\n");
            break;
        case 4:
            substring(a,b,0);
            printf("\n***请选择指令***\n");
            break;
        case 5:
            printf("请输入要替换的子串:\n");
            scanf("%s",b);
            getchar();
            printf("请输入要替换成的子串\n");
            scanf("%s",c);
            replace(a,b,c,0);
            printf("\n***请选择指令***\n");
            break;
        case 6:
            showtitle();
            break;
        case 7:
             printf("欢迎下次再来,拜拜,爱你呦(小罗结束语)\n");
              n = -1;
             break;
        default :
            printf("指令无效,请重新输入\n");
            break;
        }
        if(n==-1)
            break;
     }

    return 0;
}
//显示菜单
void showtitle(){
    printf("********************************************************\n");
    printf("*                    欢迎来到小罗查找                  *\n");
    printf("********************************************************\n\n");
    printf("1.从文件导入主串\t\t2.从文件导入模式串\n\n");
    printf("3.计算模式串的next\t\t4.对子串进行KMP查找\n\n");
    printf("5.对字串进行替换\t\t6.显示菜单\n\n"
           "7.结束查询,退出查找系统\n\n");

}


//从文件选择主串
void filemainstring(int count){
    char str[count][N];
    FILE *fp;
    if((fp = fopen("D://mainstring.txt","r"))==NULL){
        printf("File not open\n");
        exit(1);
    }
    for(int i = 0;i<count;i++){

        fscanf(fp,"%s\n",str[i]);
    }
    fclose(fp);
    printf("请选择主串\n");
    for(int i = 0;i<count;i++){
       printf("%d.%s\n",i+1,str[i]);
    }
    printf("请输入主串编号\n");
    int n ;
    scanf("%d",&n);
    int i =0, j=0 ;
    strcpy(a,str[n-1]);
    printf("选择主串成功\n");
}



//从文件选择模式串
void filesubstring(int count){
    char str[count][N];
    FILE *fp ;
    if((fp = fopen("D://substring.txt","r"))==NULL){
        printf("File not open\n");
        exit(1);
    }
    for(int i = 0;i<count;i++){

        fscanf(fp,"%s\n",str[i]);
    }
    fclose(fp);
    printf("请选择模式串\n");
    for(int i = 0;i<count;i++){
       printf("%d.%s\n",i+1,str[i]);
    }
    printf("请输入模式串编号\n");
    int n ;
    scanf("%d",&n);
    int i =0, j=0 ;
    strcpy(b,str[n-1]);
    printf("选择模式串串成功\n");

}





//计算模式串的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("没有该字串\n");
        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("查找成功\n");
    printf("有%d个子串\n",num);
}


//输出模式串的next
void showNext(char *b){
    printf("\n该模式串的next值为:\n\n");
    for(int i =0 ;i<strlen(b);i++){
        printf("%d ",next[i]);
    }
    printf("\n");
}


//替换子串
void replace(char *a,char *b,char*c,int start){
    getNext(b);

    int n = KMP(a,b,start);

    if(n==-1){
        printf("没有该字串,不能进行替换\n");
        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("\n替换前: %s\n",a);
    printf("替换后: %s\n\n",d);

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值