KMP算法在C++中的实现给出了运行时错误
KMP Algorithm Implementation in C++ gives Runtime Error
我已经在C++中实现了Knuth Morris Pratt算法。实现似乎是正确的,但是我遇到了一个运行时错误,我似乎无法理解。需要帮助。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int* PrefixFunction(string pattern) {
int m = pattern.length() ;
int PrefixTable[m] ;
PrefixTable[0] = 0 ;
int k = 0 ;
for(int q = 1; q<m; q++) {
while(k>0&&pattern[k]!=pattern[q]) {
k = PrefixTable[k] ;
}
if(pattern[k]==pattern[q]){
k = k + 1 ;
}
PrefixTable[q] = k ;
}
return PrefixTable ;
}
void KMP(string text,string pattern) {
int* PrefixTable = PrefixFunction(pattern) ;
int n = text.length() ;
int m = pattern.length() ;
int q = 0 ; //characters matched
for(int i=0;i<n;i++) {
while(q>0&&pattern[q]!=text[i]) {
q = PrefixTable[q] ;
}
if(pattern[q]==text[i]) {
q = q + 1 ;
}
if(q==m) {
cout<<"found : "<<i-m ;
q = PrefixTable[q] ;
}
}
}
int main() {
string text, pattern ;
cout<<"Enter the text : " ;
cin>>text ;
cout<<"Enter the pattern : " ;
cin>>pattern ;
KMP(text,pattern) ;
return 0 ;
}
在程序请求输入后,我得到一个运行时错误。需要指导。
PrefixFunction
正在返回一个指向具有自动存储功能的局部变量PrefixTable
的指针
当函数返回时,数组将不存在,并且取消引用指针会使程序未定义。
(在这种情况下,可能会发生的具体情况是,对length()
的调用会将它们自己的自动变量放在数组曾经所在的位置,当你使用这些"值"作为索引时,程序就会启动。(
考虑使用std::vector<int>
而不是数组。
std::vector<int> PrefixFunction(string pattern) {
int m = pattern.length();
std::vector<int> PrefixTable(m);
// As before...
如果你不能使用std::vector
,你可以使用动态分配(记住以后要释放内存(,或者你可以将表作为参数传递到函数中,而不是返回它:
void PrefixFunction(string pattern, int* PrefixTable)
// ...
void KMP(string text,string pattern) {
int m = pattern.length();
int PrefixTable[m];
PrefixFunction(pattern, PrefixTable);
// ...
返回一个局部变量PrefixTable。但是,一旦您离开了函数,这个变量的堆栈空间就会被释放。您应该将其传入或分配给new。
一句挑剔的话:如果你的类只以大写字母开头,那么函数、变量等都以小写字母开头,你的程序对很多人来说会更可读。
相关文章:
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 合并排序的C 实现的运行时错误
- 二叉搜索树实现C++运行时错误
- 离散小波变换C++实现 - 运行时错误
- Trie 实现运行时错误
- 我想在我的代码中实现一个双重循环链表 - 运行时错误
- 在C++中实现抽象工厂 PIMPL 习语的运行时错误
- 在c++中实现vector时出现运行时错误
- 快速排序实现C++运行时错误
- KMP算法在C++中的实现给出了运行时错误