KMP程序出现异常,求各位大神帮忙解决一下,谢谢

斯丢劈德Tony 2016-04-18 11:14:36
运行程序出现异常,调试的时候说异常出现在红色行,代码如下:
#include <iostream>
#include <string.h>

using namespace std;
#define MAX_STRING_SIZE 1024

class CmyString
{
public:
CmyString(char *s);
~CmyString();
//int Find(CmyString *CS,CmyString *s);
int getLength();
char* getString();
void operator=(CmyString *s);
private:
int length;
char *str[MAX_STRING_SIZE + 1];


};

CmyString::CmyString(char *s)
{
strcpy_s(*str,strlen(s),s);

length = strlen(s);
}

CmyString ::~CmyString()
{
}

int CmyString::getLength()
{
return length;
}

char* CmyString::getString()
{
return str[MAX_STRING_SIZE + 1];
}

void CmyString::operator=(CmyString *s)
{
strcpy_s(*str,strlen(s->getString()), s->getString());
length = s->getLength();
}

void GenKMPNext(int *next, CmyString *s)
{
int i = 0, j = -1;
next[0] = -1;
char *str = s->getString();
while (i < (s->getLength()- 1))
{
while (j >= 0 && str[i] != str[j])
j = next[j];
i++;
j++;
if (str[i] == str[j])
next[i] = next[j];
else next[i] = j;
}
}
int Find(CmyString *CS, CmyString *s)
{
int i, j;
CmyString *ss;
ss = s;
char *str1 = ss->getString();
char *str2 = CS->getString();
int *next=(int *)malloc(sizeof(int)*s->getLength());
GenKMPNext(next,ss);
for (i = 0, j = 0; i < ss->getLength() && j < CS->getLength();)
{
if (str1[i] == str2[j])
{
i++; j++;
}
else if (next[i] >= 0)
i = next[i];
else
{
i = 0; j++;
}
}
if (i >= ss->getLength())
return j - ss->getLength();
else
return -1;
}

int main()
{
char p[MAX_STRING_SIZE];
char target[MAX_STRING_SIZE];
cin >> p;
//char *m = (char *)p;
cin >> target;
CmyString s(p);
CmyString cs(target);
int result;
result = Find(&cs,&s);
if (result == -1)
cout << "False" << endl;
else
cout << "True" << endl;
return 0;
}
我使用的是VS2015。请各位大神帮忙看一下。目的是要实现KMP算法
...全文
169 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 2016-04-25
  • 打赏
  • 举报
回复
单步以后发现是strcpy_s(*str,strlen(s),s);有问题 你的char *str[MAX_STRING_SIZE + 1];是不是有问题? 这定义的是一个指针数组,不是一个数组指针啊? CmyString::CmyString(char *s) { strcpy_s(*str,strlen(s),s); length = strlen(s); } 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)
shiter 2016-04-25
  • 打赏
  • 举报
回复
char *s 这个参数你看看传递进来时候有值没有?
斯丢劈德Tony 2016-04-18
  • 打赏
  • 举报
回复
引用 1楼赵4老师 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
看不懂,表示新手。
赵4老师 2016-04-18
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧