sigsegv во время выполнения программы - PullRequest
0 голосов
/ 21 февраля 2012

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

#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;
}

1 Ответ

1 голос
/ 21 февраля 2012

Я запускаю gdb для отладки вашей программы, ошибка сегмента возникает в строке 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;
    }
    ...
   }

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

...