Ошибка SIGSEGV при загрузке ввода

Я пытался решить иголка в проблеме сена в 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;
}

Может кто-нибудь объяснить, почему я получаю эту ошибку только при загрузке ввода, когда обычно эта программа работает нормально и денди.

1

Решение

Очень легко изолировать segfault (включая sigsegv) с помощью отладчика.

Если вы разрабатываете на Unix, пожалуйста, запустите ваш код в отладчике.

  1. Скомпилируйте ваш код с -g флаг.
  2. Запустите ваш код в GDB следующим образом: gdb a.out (или название программы)
  3. Бежать: (gdb) run
  4. Ваша программа вылетит на вашем сегфоуте. Он должен показать вам точный номер строки, на которой это происходит. Возможно, вам придется набрать bt или же where проследить это назад.

В IDE это даже проще. Обычно вы отлаживаете, ища символ отладки, часто графически представленный ошибкой (например, Eclipse). Я не знаком с используемой вами IDE, поэтому, возможно, если у вас возникнут проблемы, кто-нибудь может опубликовать ответ, относящийся к этой IDE.

2

Другие решения

Как предложил Дэв в комментарии, вы используете неинициализированный указатель (шаблон) с get, то есть segfault.

2

По вопросам рекламы [email protected]