2012-02-21 3 views
0

Я писал эту проблему для отправки в spoj, она отлично работает на моем компьютере, g ++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1. Но это дает SIGSEGV на spoj. вот мой код для поиска следующего палиндрома, может кто-то помочь. Кроме того, я попытался поймать его с обработчиком сигнала, но он никогда не 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, так что, по крайней мере, у вас есть номер строки, где возникает проблема. –

+0

Единственное, что если v и p оба размера 0, то вторая строка 2 в NextPalindrome, вероятно, будет segfault. Кроме того, второй вызов ConvertToPalindrome из main должен, вероятно, иметь «p, размер/2-1, размер/2 + 1». Если вы перейдете в 123, вы должны ожидать, что аргументы будут равны p, 0, 2, а не p, 0, 0 – vmpstr

+0

@charles его не дает никакой ошибки, когда я запустил его на своем gdb .. –

ответ

1

Я отлаживать для отладки программы, ошибка сегмента происходит на линии num[num.size()-1] = 1; в функции void NextPalindrome(vector<int>& num, int pos1, int pos2). Когда вектор num пуст, то индекс выходит за пределы диапазона. Такая ситуация возникает, когда пользователь не вводит достаточное количество чисел (меньше, чем t). Вы можете проверить, является ли входная строка пуста, чтобы избежать этого:

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

Кстати, палиндром логика кажется неправильным, вы можете отлаживать себя.

+0

его еще не решил ошибку sigsegv, пожалуйста помочь или предложить, как я могу отладить это. –

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