目的:确定字串第一次在主串中出现的位置
思想:主串从头开始,与字串进行比较,若字母匹配,主串下标自增一位,字串长度也下标一位,继续比较,若不相同,主串下标自增一位,字串从头开始,继续主串当前下标字母进行比较。
例子: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#include #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("字串在主串中的位置:%dn",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 }



