一、代码如下
/*
项目名称:串的模式匹配算法
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.10.11
学习目标:1.BF算法
注意事项:1.测试所有功能是否正常
*/
#include <stdio.h>
#include <string.h>
#define ERROR 0
#define OK 1
#define MAXSTRLEN 255
typedef bool Status;
typedef unsigned char String[MAXSTRLEN+1];//0号单元存放串的长度
Status StrAssign(String &T,char *s);
int BF_Index(String S,String T,int pos);
Status StrOut(String S);
int main()
{
char chars1[]="123abcdef";
char chars2[]="abc";
String S,T;
StrAssign(S,chars1);
StrAssign(T,chars2);
printf("S");
StrOut(S);
printf("T");
StrOut(T);
printf("BF算法:");
int location=BF_Index(S,T,2);
if(!location)
printf("在S串中没有T串\n\n");
else
printf("T串在S串pos后的下标为%d\n\n",location);
return 0;
}
Status StrAssign(String &T,char *s)
{
int i;
if(strlen(s)>MAXSTRLEN)
return ERROR;
else
{
T[0]=strlen(s);
for(int i=0;i<T[0];i++)
T[i+1]=s[i];
return OK;
}
}
//返回T串在S串中第pos个字符之后的位置
int BF_Index(String S,String T,int pos)
{
int i=pos,j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
{
++i;
++j;
}
else
{
i=i-j+2;//1.未比较完情况下,假设成功比较了n次,第n+1次失败了;
j=1; //2.那么i=pos+n,j=1+n;
//3.要使i=pos+1,那么需i-j+2;
}
}
if(j>T[0]) //比较后字符全相等
return i-T[0];//返回比较的起始下标
}
Status StrOut(String S)
{
printf("串内容: ");
for(int i=1;i<=S[0];i++)
{
printf("%c",S[i]);
}
printf("\n\n");
return OK;
}
二、结果
![](https://i-blog.csdnimg.cn/blog_migrate/9b7f0d9ab4cbd36636b83d621e7c0acc.png)