2013-05-15 2 views
1

Я попытался решить the needle in the haystack problem в ideone, но я получаю SIGSEGV.Ошибка 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; 
     }  

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

+3

Вы не выделяете какую-либо память для шаблона для начала. – DaV

+0

Что вы пробовали? Проводка кода и высказывание «пожалуйста, отлаживайте это для меня» вряд ли поможет кому-либо помочь вам, так как вы не продемонстрировали, что вы сделали даже базовые усилия для отладки. – templatetypedef

ответ

2

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

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

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

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

+0

см. Http://meta.stackexchange.com/q/179772/183887, почему этот ответ уместен – djechlin

+0

никаких проблем, но я простой кодер, я никогда не использовал unix, и я использовал компилятор Ideone, поэтому мой запрос все еще остается – swapedoc

+0

@ user2371549 ваш запрос останется, пока вы не научитесь использовать отладчик по вашему выбору. Если вам удастся решить эту проблему, в противном случае у вас будет аналогичный запрос снова в самом ближайшем будущем и снова застрянет. Лучше научиться облегчать жизнь себе раньше, чем позже. – djechlin

2

Как сказал Дав в комментарии, вы используете неинициализированный указатель (рисунок) с помощью gets, таким образом, segfault.

Смежные вопросы