1

我试图在ideone中解决大海捞针问题,但我得到了一个 SIGSEGV。

这是我的代码:

    //start
    #include<cstring>
    #include<cstdio>
    #include<vector> 
    using namespace std;


    int *overlap;
    char *pattern;
   //used Knuth morris prat algo
   void calcoverlap()
   {
    overlap[0] = 0;
    unsigned int length,i,len;  
    length=strlen(pattern);

    while(i<length)
    {
        if (pattern[i] == pattern[len])
        {
            len++;
            overlap[i] = len;
            i++;
        }
        else
        {
            if (len != 0)
            {
                len = overlap[len-1];
            }
            else
            {
                overlap[i++] = 0;
            }
        }

    }
   }
    //this is final function for pattern matching
    vector< int > patternmatching(int m)
{
vector< int > V;
int i = 0, j = 0;
char ch;
while(1)
{
ch = getchar();
if(ch == '\n') break;
while(1)
{
if(ch == pattern[j])
{
j++;
if(j == m)
{
V.push_back(i-m+1);
j = overlap[j];
}
break;
}
else if(j == 0) break;
else j = overlap[j];
}
i++;
}
    return V;
    }




   int main()
   {
        int n,i,sz;
        vector<int> V;
        while(scanf("%d",&n)==1)
        {   
            gets(pattern);
            calcoverlap();
            V=patternmatching(n);
            sz = V.size();
           for(i=0; i < sz; i++)
            printf("%d\n",V[i]);
            if(!sz) printf("\n");
            delete[] pattern;
            delete[] overlap;
        }
         return 0;
        }    

有人可以解释为什么我只在上传输入时才收到此错误,而该程序通常运行良好且花花公子。

4

2 回答 2

2

使用调试器很容易隔离段错误(包括 sigsegv)。

如果您在 Unix 上开发,请在调试器中运行您的代码。

  1. -g使用标志编译代码。
  2. 按如下方式在 gdb 中运行您的代码 - gdb a.out(或程序名称)
  3. 跑: (gdb) run
  4. 您的程序将因您的段错误而崩溃。它应该向您显示它发生的确切行号。您可能需要输入btwhere追溯它。

在 IDE 中,它甚至更容易。通常您通过查找调试符号进行调试,通常由错误图形表示(例如 Eclipse)。我不熟悉您使用的 IDE,所以如果您遇到问题,也许有人可以发布特定于该 IDE 的答案。

于 2013-05-15T22:10:17.477 回答
2

正如 Dav 在评论中建议的那样,您使用未初始化的指针(模式)和获取,因此是段错误。

于 2013-05-19T20:55:20.973 回答