上传输入时出现SIGSEGV错误

SIGSEGV error while uploading input

本文关键字:SIGSEGV 错误 传输 输入      更新时间:2023-10-16

我试图在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("%dn",V[i]);
            if(!sz) printf("n");
            delete[] pattern;
            delete[] overlap;
        }
         return 0;
        }    

有人可以解释为什么我得到这个错误只有在上传输入时,正常情况下,这个程序运行得很好和漂亮。

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

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

  1. 使用-g标志编译代码。
  2. 在gdb中运行代码如下- gdb a.out(或程序名称)
  3. Run: (gdb) run
  4. 你的程序会在你的段错误时崩溃。它应该会显示它发生的确切行号。您可能必须键入btwhere来跟踪它。

在ide中更容易。通常你通过寻找一个调试符号来进行调试,这个符号通常用一个bug(例如Eclipse)图形化地表示。我不熟悉你使用的IDE,所以如果你有问题,也许有人可以发布一个特定于IDE的答案。

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