对于程序的语法报错问题,就是根据提示去找问题,不要自己瞎猜(猜的基本都是错的)
1.其中对于C语言的函数申明:extern int strStr(char * x, char * y)
如果根据提示查,根本就解决不了。
2.关于数据类型的不匹配问题也是需要根据提示来改正。
解决了语法编译的问题,但是还是不能输出结果:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern int strStr(char * x, char * y);
extern int indexKMP(char *x, char *y,int z);
int main(){
char * haystack = "sssdjiefon";
char * needle = "st";
int result = strStr(haystack,needle);
return result;
}
int strStr(char * haystack, char * needle){
int j = indexKMP (haystack, needle, 1);
return j;
}/**
数据结构中的伪代码是不符合语法的,一个char数组却在首部存了整个数组的长度(int类型)
*/
int * getnext(char* T,int *next){
int length = strlen(T);
next = (int *) malloc(sizeof(int)*length + 1);
int i = 0;next[1] = 0; int j = 0; //next[i]表示的是有待匹配的字符在字符串中的位置
while(i < length){ //设计上模式串是从下标为0的位置开始匹配的
if(j == 0 || T[i] == T[j]){ //next[]的设计需要和KMP具体的匹配函数相匹配 (如果模式串的第一个字符就和主串匹配,主串和模式串都需要向右边转移)
++i;++j;next[i] = j; //因为在设计上是模式串是从1开始的
}
else{
j = next[j]; //告知模式串需要右移动的位数
}
}
return next;
}
/**
KMP算法的思路
*/
int indexKMP(char *S, char *T,int pos){
//需要利用T的next数组进行 利用模式串T的next函数求主串S中第pos个字符之后的位置
int lengths = strlen(S);
int lengtht = strlen(T);
int *next =(int *) malloc(sizeof(int)*lengtht +1);
next = getnext(S,next);
int i = pos; int j = 1;
while(i <= lengths && j <= lengtht ){
if(j == 0 && S[i] == T[j]){
++i;++j;
}
else{
j = next[j];
}
if(j > T[0]) return i-T[0];
else return -1;
}
}
来源:CSDN
作者:ABCxml
链接:https://blog.csdn.net/qq_42664961/article/details/103791031