⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bm.cpp

📁 自己做的一个BM小算法...有很多不足之处请大家多多指教
💻 CPP
字号:
#include <stdio.h> 

#include "iostream.h"

char t[1000],p[50],q[50];

int l,n,m,k,j=0,i=0,h=0;

int a;

int Pdist(char x)//求出dist[c]的值

{

       int a=0,b,flag=0;

       while(a<m-1&&flag==0)

       {

              if(x!=p[a]) a++;

              else flag=1;

       }

       if(flag==0)  return m;//字符不出现在模式串中 

       else         //字符出现在模式串中

       {

              for(a=0;a<m-1;a++)

                 if(x==p[a]) b=a;

              b=m-b-1;

              return b;

       }

}

void Text()

{

       cout<<"请输入正文串,并以$结束:\n";

       do

       {

              cin >> t[i];

              i++;

       }

       while(t[i-1]!='$' && i<=100);

       n=i-1;  //正文串长度

       t[i-1]='\0';

}

void Pattern()

{

       j=0;

       do

       {

              cin >>p[j];

              j++;

       }

       while(p[j-1]!='$' && j<=50);

       m=j-1;  //模串长度

}

void query()

{

       h=0;

       do

       {

              cin >>q[h];

              h++;

       }

       while(q[h-1]!='$' && h<=50);

       l=h-1;  //模串长度

}

void BM()

{

       int c;

       int flag1=0;

       i=m-1;

       do

       {

              j=m-1;k=i;

              while(j>=0&&p[j]==t[k])

              {

            j=j-1;

                     k=k-1;

              }

              if(j==-1)

              {

                     switch(a)

                     {

                     case 1:cout<<"匹配串在正文串中的位置:"<<i-m+2<<endl;

                            break;

                     case 2:if(l<=m)

                               {

                                      for(c=0;c<l;c++) t[i-m+1+c]=q[c];

                                      for(c=0;i+1+c<=n;c++) t[i-m+l+1+c]=t[i+c+1];

                               }

                               else 

                               {

                                      for(c=0;c<n-i;c++) t[n+l-m-c]=t[n-c];

                                   for(c=0;c<l;c++) t[i-m+1+c]=q[c];

                               }

                               n=n+l-m;

                               break;

                     case 3:for(c=0;c<=n-i;c++) t[i-m+1+c]=t[i+1+c];

                            break;

                     }

                     i=i+1;

                     flag1=1;

              }

              else i=i+Pdist(t[i]);  //求主串下一个匹配字符

       }

       while(i<=n);

       if(flag1==0) cout<<"没有匹配的字符串!"<<endl;

}

void save() 

{ 

       FILE *fp;                     /*定义文件指针*/ 

    fp=fopen("d:\\banmin.txt", "w+");    /*建立一个文字文件只写*/ 

       fprintf(fp,"%s",t);

    fclose(fp);                   /*关闭文件*/ 

} 

void main()

{

       Text();

       do

       {

           cout<<"请选择:\n\t1.查找\n\t2.替换\n\t3.删除\n\t4.保存\n\t5.退出\n";

           cin >>a;

           switch(a)

              {

           case 1:cout<<"请输入要查找的字符串,并以$结束:\n";

                     Pattern();

                  BM();

                  break;

              case 2:cout<<"请输入要替换的字符串,并以$结束:\n";

                     Pattern();

                     cout<<"请输入替换字符串,并以$结束:\n";

                     query();

                     BM();

                     cout<<"编辑后的正文串为:\n"<<t<<endl;

                     break;

              case 3:cout<<"请输入要删除的字符串,并以$结束:\n";

                     Pattern();

                     BM();

                     cout<<"编辑后的正文串为:\n"<<t<<endl;

                     break;

           case 4:save();

                  break;

           default:break;

              }

       }

       while(a!=5);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -