为什么模式匹配失败?编译正确。不是kmp。
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define MAXSTRLEN 255
#define OK 1
#define ERROR 0
typedef int Status;
typedef unsigned char SString[MAXSTRLEN+1];
Status StrAssign(SString T, char *chars){
int i;
if(strlen(chars)>MAXSTRLEN){
return ERROR;
}
else{
T[0]=strlen(chars);
//复制chars指向的字符串的内容到串T
for(i=1;i<=T[0];i++){
//i是从1开始的,所以要-1,因为chars的字符数据是从0开始的
T[i]=*(chars+i-1);
}
return OK;
}
}
Status Index(SString S,SString T,int pos){
//返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。
//其中,T为非空,1<=pos<=StrLength(S)。
int i=pos,j=1;
while(i<=S[0]&&j<=T[0]){
if(S[i]==T[i]){i++;j++;
}
else{i=i-j+2;j=1;
}
}
if(j>T[0])return i-T[0];
else return 0;
}
int main(){
Status k;
char c[MAXSTRLEN];
SString S,T;
//从键盘输入字符,生成定长串
printf("串生成:\n");
printf("请输入主串S:");gets(c);
if(!(StrAssign(S,c))){
printf("串长超过MAXSTRLEN(=%d)!\n",MAXSTRLEN);
exit(0);
}
printf("请输入模式串T:");gets(c);
if(!(StrAssign(T,c))){
printf("串长超过MAXSTRLEN(=%d)!\n",MAXSTRLEN);
exit(0);
}
k=Index(S,T,1);
if(!k)printf("匹配失败");
else ("匹配成功,首次出现位置%d",k);
return 0;
}