繁体   English   中英

C ++中的KMP算法实现会导致运行时错误

[英]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进行分配。

挑剔的一句话:如果您只使用大写字母开始类,那么函数,变量等都使用小写字母,那么您的程序将对许多人更具可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM