引发了未经处理的异常:读取访问权限冲突。 **t** 是 0xCE1AC0D6。 出现了

时间:2022-08-09 15:20:18
实现kmp算法,但引出了异常,我试着调试,但看不懂,不知道错哪里

#include<stdio,h>
#include<string,h>

typedef char DataType;
void GetNext(DataType* t, int* next, int tlength)
{
int i = 1, j = 0;
next[1] = 0;
while (i < tlength)
{
if (j == 0 || t[i] == t[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int IndexKmp(DataType *s, DataType *t, int pos, int tlength, int slength, int *next)
{
int i = pos, j = 1;
while (i <= slength&&j <= tlength)
{
if (j == 0 || t[j]==s[i])
{
i++;
j++;
}
else
j = next[i];

}
if (j > tlength)
return i - tlength;
else
return 0;
}

int main()
{
int locate, tlength, slength, next[256];
DataType s[256], t[256];
printf("输入主串:\n");
scanf("%s", s);
slength = strlen(s);
printf("输入子串:\n");
scanf("%s", t);
tlength = strlen(t);
GetNext(t, next, tlength);
locate = IndexKmp(s, t, 0, tlength, slength, next);
printf("匹配位置:%d\n", locate);
    return 0;
}

4 个解决方案

#1


你确定你的程序可以编译吗?
#include<stdio,h> //是点,不是逗号
#include<string,h>

#2


出错时中断下来,通过调用堆栈定位到相关位置,分析原因,你IndexKmp函数中,next[i]没初始,j赋值后是一个未初始的值,之后访问t[j]导致出错

#3


关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源 http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

#4


#include<stdio.h>
#include<string.h>

typedef char DataType;

void GetNext(DataType* t, int* next, int tlength)
{
    int i = 1, j = 0;
    next[1] = 0;
    while (i < tlength)
    {
        if (j == 0 || t[i] == t[j])
        {
            ++i;
            ++j;
            next[i] = j;
            printf("i = %d, next[%d] = %d\n", i, i, next[i]);
        }
        else
        {
            j = next[j];
            printf("++++%d\n", j);
        }
        printf("i = %d\n", i);
    }
}

int IndexKmp(DataType *s, DataType *t, int pos, int tlength, int slength, int *next)
{
    int i = pos, j = 1;

    while (i <= slength&&j <= tlength)
    {
        if (j == 0 || t[j]==s[i])
        {
            i++;
            j++;
        }
        else {
            j = next[i];
            printf("****i = %d,  %d\n", i, j);
        }

    }
    if (j > tlength)
        return i - tlength;
    else
        return 0;
}

int main()
{
    int locate, tlength, slength, next[256];
    DataType s[256], t[256];
    printf("输入主串:\n");
    scanf("%s", s);
    slength = strlen(s);
    printf("输入子串:\n");
    scanf("%s", t);
    tlength = strlen(t);
    GetNext(t, next, tlength);
    locate = IndexKmp(s, t, 0, tlength, slength, next);
    printf("匹配位置:%d\n", locate);
    return 0;
}


代码逻辑有问题,GetNext函数会将下标为1, 2, 3.。。设置为1,但是下标为0的为随机数;
当进入IndexKmp函数时,初始化j = 1;那么循环中j == 0就不会运行。所以直接是j = next[i];此时i为0,跳出循环;

#1


你确定你的程序可以编译吗?
#include<stdio,h> //是点,不是逗号
#include<string,h>

#2


出错时中断下来,通过调用堆栈定位到相关位置,分析原因,你IndexKmp函数中,next[i]没初始,j赋值后是一个未初始的值,之后访问t[j]导致出错

#3


关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源 http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

#4


#include<stdio.h>
#include<string.h>

typedef char DataType;

void GetNext(DataType* t, int* next, int tlength)
{
    int i = 1, j = 0;
    next[1] = 0;
    while (i < tlength)
    {
        if (j == 0 || t[i] == t[j])
        {
            ++i;
            ++j;
            next[i] = j;
            printf("i = %d, next[%d] = %d\n", i, i, next[i]);
        }
        else
        {
            j = next[j];
            printf("++++%d\n", j);
        }
        printf("i = %d\n", i);
    }
}

int IndexKmp(DataType *s, DataType *t, int pos, int tlength, int slength, int *next)
{
    int i = pos, j = 1;

    while (i <= slength&&j <= tlength)
    {
        if (j == 0 || t[j]==s[i])
        {
            i++;
            j++;
        }
        else {
            j = next[i];
            printf("****i = %d,  %d\n", i, j);
        }

    }
    if (j > tlength)
        return i - tlength;
    else
        return 0;
}

int main()
{
    int locate, tlength, slength, next[256];
    DataType s[256], t[256];
    printf("输入主串:\n");
    scanf("%s", s);
    slength = strlen(s);
    printf("输入子串:\n");
    scanf("%s", t);
    tlength = strlen(t);
    GetNext(t, next, tlength);
    locate = IndexKmp(s, t, 0, tlength, slength, next);
    printf("匹配位置:%d\n", locate);
    return 0;
}


代码逻辑有问题,GetNext函数会将下标为1, 2, 3.。。设置为1,但是下标为0的为随机数;
当进入IndexKmp函数时,初始化j = 1;那么循环中j == 0就不会运行。所以直接是j = next[i];此时i为0,跳出循环;