2012-02-21 14 views
0

私はspojで提出するためにこの問題を書いていました。私のコンピュータでg ++(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1.But spojにSIGSEGVを与えています。 ここに次の回文を見つけるための私のコードは、誰かが助けてくれることができます。私はあなたのプログラムをデバッグするGDBを実行しプログラムの実行中に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のようなデバッガで実行すると、少なくとも問題が発生している行番号が表示されます。 –

+0

唯一のことは、vとpの両方がサイズ0の場合、NextPalindromeの2番目の行2がおそらくセグメンテーション違反になることです。また、メインからの2番目のConvertToPalindrome呼び出しは、おそらく "p、size/2-1、size/2 + 1"であるべきです。 123を渡すと、引数がp、0、2ではなくp、0、0であると予想されるはずです – vmpstr

+0

@charles gdbで実行したときにエラーが発生しません。 –

答えて

1

.. はまた、私は、シグナルハンドラでそれをキャッチしようとしたが、それはthrowed.please助けることはありません、セグメントの障害は機能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エラーが解決していません。助けてください、または私がそれをデバッグする方法を提案する –

関連する問題