分段错误添加两个表示为字符串的大数字

时间:2014-01-25 22:30:28

标签: c++ string algorithm biginteger

这是代码片段或者更确切地说是一个函数,它将两个字符串作为输入,基本上是大整数并打印它们的总和。我正确地打印了总和,但最后出现了分段错误,我无法弄清楚它的来源。

string sum(string x, string y) {
    bool carry = false;
    int yLen = y.length(), xLen = x.length();
    vector<char> s;
    for(int i = xLen - 1, j = yLen - 1; i >= 0, j >= 0; i--, j--) {
        int a = x[i] - '0', b = y[j] - '0';
        int c = (carry?(a+b+1):(a+b));
        if(c/10)        carry = true, c %= 10;
        else            carry = false;
        s.push_back(c + '0');
    }
    for(int i = xLen - yLen - 1; i >= 0; i--) {
        int a = x[i] - '0';
        int c = (carry?(a+1):(a));
        if(c/10)        carry = true, c %= 10;
        else            carry = false;
        s.push_back(c + '0');
    }
    reverse(s.begin(), s.end());
    for(vector<char>::iterator i = s.begin(); i != s.end(); i++)        cout<<*i;
    cout<<endl;
}

更新:假设x.length()在输入本身中总是大于或等于y.length()。

2 个答案:

答案 0 :(得分:3)

您的函数返回string

您需要返回一个字符串,或将其更改为void

void sum(string x, string y) {

Not returning in a value-returning function is undefined behaviour可能是导致细分错误的原因。

答案 1 :(得分:1)

此循环语句

for(int i = xLen - 1, j = yLen - 1; i >= 0, j >= 0; i--, j--) {

已经错了。

循环中的第二个表达式

i >= 0, j >= 0

是逗号运算符的表达式。它没有考虑到我可以小于0.表达式的值是条件j> = 0的值。所以如果xLen小于yLen那么你将得到我将等于某些负数数。

你应该重写这个循环。我认为你的意思是表达

i >= 0 && j >= 0