kmp算法匹配文本文件

为什么匹配不到文件中的字符

#include <stdio.h>
#include <stdlib.h>

#define maxsize 1000                   //最大串长
typedef char SString[maxsize];         //串的定长顺序存储表示,0号单元存放串的长度
int next[maxsize];                     //KMP算法中用到的next数组

void get_next(SString T,int next[ ])   //求模式串T的next函数值并存入数组next
{
    int j=1,k=0;
    next[1]=0;
    while (j<T[0])
    {
        if(k==0||T[k]==T[j])
        {
            ++j;
            ++k;
            if(T[j]!=T[k])
                next[j]=k;
            else
                next[j]=next[k];
        }
        else
            k=next[k];
    }
}

int Index(SString S,SString T,int pos)  //利用模式串T的 next函数求T在主串S中第pos个字符之后的位置的KMP算法
{
    int i=pos,j=1;
    while(i<=S[0]&&j<=T[0])
    {
        if(j==0||S[i]==T[j])            //继续比较后继字符
        {
            ++i;
            ++j;
        }
        else
            j=next[j];                  //模式串向右移动
    }
    if (j>T[0])
        return (i-T[0]);                //匹配成功
    else
        return 0;                       //匹配失败
}

int length(SString str)                 //求串长
{
    int i =1;
    while(str[i]) i++;
    return(i-1);
}

void find(char name[],SString keys)     //对于输入的每一个要查找的关键字,从小说文件中逐行读取字符串查找
{
    SString text;                       //存放从小说文件读取的一行字符串
    int i=1,j=0,k;                      //i用于存放行号,j用于存放列列号,k用于输出格式的控制
    int n=0;                            //n记录出现的次数
    FILE *fp;
    if(!(fp=(fopen(name,"r+"))))        //打开小说文件
    {
        printf("打开文件失败!\n");
        exit(0);
    }
    keys[0]=length(keys);               //调用length函数求关键字长度
    get_next(keys,next);                //调用get_next函数求模式串(关键字)每一个字符对应的next值
    printf("\n%s出现于:\n",&keys[1]);  //打印关键字
    while(!feof(fp))                     //如果还没有到小说文件末尾
    {

        k=0;
        fgets(&text[1],maxsize,fp);     //从小说文件中读取一行字符串,存入text串中
        text[0]=length(text);
        j=Index(text,keys,j+1);         //调用KMP算法,统计关键字在该行出现的位置,若匹配不成功则返回0
        if(j!=0)                        //若匹配成功则打印行号和列号
        {
            printf("\trow=%d,\tcol=%d",i,j);
            k++;
            n++;
        }
        while(j!=0)                     //若该行找到了关键字,则继续寻找看是否还能匹配成功
        {
            j=Index(text,keys,j+1);     //调用KMP算法从刚找到的列号后一位字符匹配
            if(j!=0)
            {
                n++;
                printf(",%d",j);        //若匹配成功,则打印列号
            }
            i++;                            //行号加1,在下一行中寻找
        }
            if(k) printf("\n");


    }
    printf("%S共出现%d次\n",&keys[1],n);
}

void main()
{
    char name[100];                     //存储输入的小说路径字符串
    SString words[100];                 // 定义字符串数组,用于存储输入的关键字
    int n,i;
    printf("请输入已创建的文本文件的路径(例如:D:\\passage1.txt):");
    scanf("%S",name);                   //用户输入包含路径的文本文件名
    printf("请输入需要查找的单词个数:");
    scanf("%d",&n);
    printf("请输入需要查找的单词,词与词之间用空格隔开(区分大小写):\n");

    for(i=0;i<n;i++)
        scanf("%s",&words[i][1]);       //用户一次性输入要查找的关键字,words[i][0]用于存放字符串的长度
    for(i=0;i<n;i++)
        find(name,words[i]);
}

img