#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>
#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里面下载“适合程序员的键盘练习”
在报纸或杂志上随便找一段约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>
#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里面下载“适合程序员的键盘练习”
在报纸或杂志上随便找一段约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,跳出循环;