#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_next(int next[],char *str)
{
int i=0;
int j=-1;
next[0] = -1;
while(i < strlen(str)-1)
{
if(j == -1 || str[i] == str[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int Index_KMP(int pos,char *T,char *S)
{
int i,j;
j = 0;
i = pos;
int next[1000];
get_next(next,T);
while(i < (int)strlen(S) && j < (int)strlen(T)) //需要强制转换strlen,若是没有强制转换j为-1时会结束循坏
{
if( j == -1 || S[i] == T[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(j == strlen(T))
return i-strlen(T);
else
return -1;
}
char *s_gets(char *str,int n)
{
char *pt;
pt=fgets(str,n,stdin);
if(pt)
{
while(*str && *str != '\n')
str++;
if(*str == '\n')
*str = '\0';
else
while(getchar()!='\n')
continue;
}
return pt;
}
int main()
{
char S[1000];
char T[1000];
int pos;
int find;
printf("请输入主字符串(EOF与开头回车退出):");
while(s_gets(S,1000) != NULL && S[0] != '\0')
{
printf("请输入子字符串:");
s_gets(T,1000);
printf("请输入从哪个位置开始查找:");
scanf("%d",&pos);
getchar();
printf("第一次出现子串的位置为:%d\n",Index_KMP(pos,T,S));
printf("请输入主字符串(EOF与开头回车退出):");
}
return 0;
}
08-11
1329
09-16