程序执行期间的sigsegv

时间:2012-02-21 16:36:36

标签: c++ g++

我写的这个问题是在spoj中提交的,它在我的计算机上正常运行,g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1。但是它在spoj上给出了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;
}

1 个答案:

答案 0 :(得分:1)

我运行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;
    }
    ...
   }

顺便说一句,Palindrome逻辑似乎错了,你可以自己调试。