我试着用ideone来解决the needle in the haystack problem,但是我得到了一个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;
} 有人可以解释一下,为什么我得到这个错误,只有当上传输入,而这个程序正常运行良好和花哨。
发布于 2013-05-16 06:10:17
使用调试器可以很容易地隔离段错误(包括sigsegv)。
如果您在Unix上进行开发,请在调试器中运行代码。
-g标志编译你的代码。gdb a.out (或程序名)bt或where才能追溯。在IDE中,这甚至更容易。通常,您可以通过查找调试符号来进行调试,该符号通常以图形方式表示为bug (例如Eclipse)。我不熟悉您使用的IDE,所以如果您遇到问题,也许有人可以发布一个特定于该IDE的答案。
发布于 2013-05-20 04:55:21
正如Dav在注释中建议的那样,您在get中使用了一个未初始化的指针(模式),因此出现了segfault。
https://stackoverflow.com/questions/16575770
复制相似问题