gpt4 book ai didi

c++ - 上传输入时出现 SIGSEGV 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:22 26 4
gpt4 key购买 nike

我试图解决 the needle in the haystack problemideone ,但我得到了一个 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;
}

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

最佳答案

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

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

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

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

关于c++ - 上传输入时出现 SIGSEGV 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com