不匹配时两次指针回退:
i退回到上次匹配首位的下一位
j退回到子串T的首位
C语言极简版
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
int Index(char S[], char T[], int pos)
{
int i = pos;
int j = 0; /* j用于子串中当前位置下标值 */
while (i <= 7 && j <= 1) /* 若i小于S的长度8并且j小于T的长度2时,循环继续 */
{
if (S[i] == T[j]) /* 两字母相等则继续 */
{
++i;
++j;
}
else /* 指针后退重新开始匹配 */
{
i = i-j+1; /* i退回到上次匹配首位的下一位 */
j = 0; /* j退回到子串T的首位 */
}
}
if (j > 1) //j超出模式串的长度
return i-2;//2为模式串的长度
else
return 0;
}
int main(){
printf("请输入主串\n");
char zhu[100];
scanf("%s",&zhu);//scanf("%s",zhu);在vs2010中能编译通过
getchar();
printf("请输入模式串\n");
char model[100];
scanf("%s",&model);
getchar();
int jieguo=Index(zhu,model,0);
printf("请输入模式串+%d\n",jieguo);
return 0;
}
优化版:在字符串的首位填入字符串的长度
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
int Index(String S, String T, int pos)
{
int i = pos;
int j = 1; /* j用于子串中当前位置下标值 */
while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
{
if (S[i] == T[j]) /* 两字母相等则继续 */
{
++i;
++j;
}
else /* 指针后退重新开始匹配 */
{
i = i-j+2; /* i退回到上次匹配首位的下一位 */
j = 1; /* j退回到子串T的首位 */
}
}
if (j > T[0])
return i-T[0];
else
return 0;
}