目的:确定字串第一次在主串中出现的位置
思想:主串从头开始,与字串进行比较,若字母匹配,主串下标自增一位,字串长度也下标一位,继续比较,若不相同,主串下标自增一位,字串从头开始,继续主串当前下标字母进行比较。
例子:4
主串:ABCDCAD
字串:CAD
子串首位C与主串A比,不同,主串下标+1变成B,字串回到起点C。
子串首位C与主串B比,不同,主串下标+1变成C,字串回到起点C。
子串首位C与主串C比,相同,主串下标+1变成D,,字串下标+1变A,子串第二位A与主串D比,不同,主串下标回溯变成D,字串回到起点C。
子串首位C与主串D比,不同,主串下标+1变成C,字串回到起点C。
子串首位C与主串C比,相同,主串下标+1变成A,,字串下标+1变A,子串第二位A与主串A比,相同,主串下标+1,变成D,字串下标+1变成D,匹配,找到了!
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 255
typedef struct Hstring
{
char zfc[MAX_NUM];
int length;
}Hstring;
int BFCompare(Hstring* parents,Hstring* child,int pos);
int main(void)
{
Hstring parents={"ABCDCAD",7};
Hstring child={"CAD",3};
printf("字串在主串中的位置:%d\n",BFCompare(&parents,&child,1));
return 0;
}
int BFCompare(Hstring* parents,Hstring* child,int pos)
{
int i = pos; //i用去主串的起始位置,一般pos都是传0
int j = 1; //字串的起始位置,位置是1,下标还是0
while(i<=parents->length && j<=child->length)
{
if(parents->zfc[i-1] == child->zfc[j-1])
{
i++;
j++;
}
else
{
i = i - j + 2; //i回溯到上次匹配的下一位
j = 1; //回到首串第一个位置
}
}
if(j > child->length)
{
return i-child->length; //与字串相同的第一个字母的下标
}
return 0; //没找到,返回 0
}