2012-02-21 90 views
0

我正在寫這個問題提交在spoj中,它運行正常,在我的電腦上,g ++(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1.But它在關於spoj提供SIGSEGV。 這是我尋找下一個迴文的代碼,有人可以幫忙。 此外,我試圖與信號處理程序捕獲它,但它從來沒有throwed.please幫助..sigsegv在程序執行期間

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

bool comp(const vector<int>& v1, const vector<int>& v2) 
{ 
    if (v1.size() != v2.size()) 
    return v1.size() < v2.size(); 
    for (int i = 0; i < v1.size(); i++) 
    if (v1[i] != v2[i]) 
     return v1[i] < v2[i]; 
    return false; 
} 

void NextPalindrome(vector<int>& num, int pos1, int pos2) { 
    if (pos1 < 0) { 
     num[num.size()-1] = 1; 
     num.insert(num.begin(), 1); 
     return; 
    } else if (num[pos1] < 9) { 
      num[pos1] = num[pos2] = num[pos1] + 1; 
      return; 
    } else { 
      num[pos1] = num[pos2] = 0; 
      NextPalindrome(num, pos1-1, pos2+1); 
      return; 
    } 
} 

void ConvertToPalindrome(vector<int>& p, int j, int k) 
{ 
    while (j >= 0) 
    { 
    if (p[j] != p[k]) 
     p[k] = p[j]; 
    j--,k++; 
    } 
} 
int main() 
{ 
    int t; 

    cin >> t; 
    while (t) { 
    string s; 
    cin >> s; 
    vector <int> v; 
    for (int i = 0;i<s.size(); i++) 
     v.push_back(s[i]-'0'); 
    int size = v.size(); 
    vector<int> p (v); 
    if (size %2 == 0) 
    { 
     ConvertToPalindrome(p, size/2-1, size/2); 
    } 
    else 
    { 
     ConvertToPalindrome(p, size/2-1, size/2-1); 
    } 

    if (comp(v,p) == 0) { 
     if (size%2 == 0) 
     NextPalindrome(p, size/2-1, size/2); 
     else 
     NextPalindrome(p, size/2, size/2); 
    } 

    for (int i=0;i<p.size();i++) 
     cout << p[i]; 
    cout << endl; 
    t--; 
    } 
    return 0; 
} 
+0

通過像GDB這樣的調試器運行它,所以至少你有一個問題發生的行號。 – 2012-02-21 16:39:59

+0

唯一的是,如果v和p的大小都是0,那麼NextPalindrome中的第二行可能會出現段錯誤。此外,來自main的第二個ConvertToPalindrome調用應該可能具有「p,size/2-1,size/2 + 1」。如果你通過123,你應該期望參數是p,0,2而不是p,0,0 – vmpstr 2012-02-21 16:50:00

+0

@charles當我把它運行在我的gdb上時它不會給出任何錯誤.. – 2012-02-21 17:57:38

回答

1

我跑GDB調試程序,段故障功能void NextPalindrome(vector<int>& num, int pos1, int pos2)發生在行num[num.size()-1] = 1;。當矢量num爲空時,索引超出範圍。這種情況發生在用戶沒有輸入足夠的數字時(小於t)。您可以檢查輸入的字符串是否爲空,以避免這種情況:

while (t) { 
    string s; 
    cin >> s; 
    if (s.empty()) { 
     break; 
    } 
    ... 
    } 

順便說一句,迴文邏輯似乎是錯誤的,你可以調試自己。

+0

它仍然不能解決sigsegv錯誤,請幫助或建議我如何調試.. – 2012-02-21 17:55:16

相關問題