上传输入时出现SIGSEGV错误
SIGSEGV error while uploading input
我试图在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上开发,请在调试器中运行你的代码。
- 使用
-g
标志编译代码。 - 在gdb中运行代码如下-
gdb a.out
(或程序名称) - Run:
(gdb) run
你的程序会在你的段错误时崩溃。它应该会显示它发生的确切行号。您可能必须键入
bt
或where
来跟踪它。在ide中更容易。通常你通过寻找一个调试符号来进行调试,这个符号通常用一个bug(例如Eclipse)图形化地表示。我不熟悉你使用的IDE,所以如果你有问题,也许有人可以发布一个特定于IDE的答案。
正如Dav在评论中建议的那样,您使用未初始化的指针(模式)来获取,因此出现了段错误。
相关文章:
- 为什么我的递归代码给出 sigsegv 错误?
- 哪个部分导致"SIGSEGV"错误以及如何修复它?
- 声明数组时出现 SIGSEGV 错误,而不创建新的 int[size]
- 使用队列<结构时出现 SIGSEGV 错误 *>
- 如何解决非常大的阵列输入的SIGSEGV错误
- C++ SDL 中的 SIGSEGV 错误
- 删除 QSGNode 时 QtThread 的 SIGSEGV 错误
- SIGSEGV 错误详细信息和删除步骤
- 返回0后,程序会收到sigsegv错误
- 信号名称:SIGSEGV 错误
- 在某个范围内查找素数时出现 Sigsegv 错误
- 代码中奇怪的SIGSEGV错误
- 以下代码中存在运行时-sigsegv错误
- SPOJ上简单动态编程中的SIGSEGV错误
- 本机Android应用程序中出现SIGSEGV错误
- 在带有openGL和SDL的linux上使用c++时发生SIGSEGV错误
- 在链表中插入时发生SIGSEGV错误
- SIGSEGV错误(运行时错误)
- 上传输入时出现SIGSEGV错误
- 在使用malloc的数组中出现SIGSEGV错误