2014-11-21 70 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)我相信無法將最終數字存儲在向量中。

我自己並沒有真正修復代碼,但通過查看它崩潰的位置,我很確定如果你能修復這些錯誤,那麼你將處於更好的位置。

相關問題