2014-11-21 32 views
-1

有人可以帮我解决我的问题吗?如何解决我的代码中的SIGSEGV问题

我写程序,它给了我分段错误,我不知道我可以用它做什么,我试了几个小时解决它,但我不能。

如果有人可以帮助它会很好!

这是我的代码:

#include <stdio.h> 
#include <vector> 

inline int fastScanfInt(FILE *input, int *x); 

int main() 
{ 
    std::vector<int> v; 

    int t = 0; 
    fastScanfInt(stdin, &t); 

    int tmp = 0, test = 0; 
    test = fastScanfInt(stdin, &tmp); 

    while(test != EOF) 
    { 
     v.push_back(tmp); 
     test = fastScanfInt(stdin, &tmp); 
    } 

    std::vector<int>::iterator it; 
    int pos = 0, c, v_size = 0; 
    for(int i = 0; i < t; i++) 
    { 
     if(v[pos] % 2 == 0) 
     { 
      c = v[pos + 1]; 
      it = v.begin(); 
      std::advance(it, pos + 1); 
      v.erase(it); 
      v_size = v.size(); 
      pos += c % v_size; 
      if(pos > (v_size - 1)) 
       pos -= v_size; 
     } 
     else 
     { 
      c = v[pos]; 
      it = v.begin(); 
      std::advance(it, pos + 1); 
      v.insert(it, (c - 1)); 
      v_size = v.size(); 
      pos += c % v_size; 
      if(pos > (v_size - 1)) 
       pos -= v_size; 
     } 
    } 



    for(int i = pos; i < v.size(); i++) 
    { 
     printf("%d ", v[i]); 
    } 

    for(int i = 0; i < pos; i++) 
    { 
     printf("%d ", v[i]); 
    } 
} 

inline int fastScanfInt(FILE *input, int *x) 
{ 
    register char c = getc(input); 

    if(c != EOF) 
    { 
     (*x) = 0; 
     for(; ((c < 48) || (c > 57)); c = getc(input)); 

     for(; ((c > 47) && (c < 58)); c = getc(input)) 
      (*x) = ((*x) << 1) + ((*x) << 3) + c - 48; 
    } 

    return c; 
} 
+0

您是否尝试过使用gdb来调查问题? – bialpio 2014-11-21 23:49:05

回答

0

应始终确保pos我在边界索引v时。给它一个奇数的输入将导致if(v[pos] % 2 == 0)行失败,因为pos太过分了。

同样,std::advance(it, pos + 1);可以带你出界。给它一个偶数的输入可以做到这一点。

给它三个数字没有segfaulting工作,因为第二个数字存储,但第三个不是。 while(test != EOF)我相信无法将最终数字存储在向量中。

我自己并没有真正修复代码,但通过查看它崩溃的位置,我很确定如果你能修复这些错误,那么你将处于更好的位置。

相关问题