2014-01-25 3 views
0

Вот фрагмент кода или, скорее, функция, которая берет две строки в качестве входов, которые являются в основном большими целыми числами и печатает их сумму. Я правильно печатаю сумму, но в конце возникает ошибка сегментации, и я не могу понять ее источник.Ошибка сегментации с добавлением двух больших чисел, представленных в виде строк

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() в самом входе.

+0

Вы пробовали работать в отладчике? –

+0

@JoachimPileborg Нет, но я использовал несколько операторов печати в исходном исходном коде в моей системе. Еще нет подсказки! – Sunny

+0

Попробуйте запустить его в отладчике. Он точно остановится там, где произошел сбой, а затем вы можете показать и подобрать стек вызовов функций к вашему коду (если его там еще нет), где вы можете проверить значения переменных. Не уверен, что проблема в том, что на самом деле проблема в коде, который вы показываете. –

ответ

3

Ваша функция возвращает string.

Вам необходимо вернуть строку или изменить ее на void.

void sum(string x, string y) { 

Not returning in a value-returning function is undefined behaviour и, вероятно, является причиной вашей ошибки сегментации.

+0

Да, вот и все! Изменение его на void и g ++ было удовлетворено этим. Причина в этом? Я имею в виду, больше технических причин для segfault? – Sunny

+2

[Это неопределенное поведение] (http://stackoverflow.com/a/4290993/1711796). Здесь часто происходит сбой сегментации - это, как правило, попытка получить доступ к памяти, которую процессор не может физически адресовать »(Wikipedia), что имеет смысл, поскольку функция может пытаться вернуть то, к чему у нее нет доступа. – Dukeling

+0

Большое спасибо! – Sunny

1

Этот оператор цикла

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

уже неправильно.

Второе выражение в петле

i >= 0, j >= 0 

является выражением оператора запятой. Он не принимает во внимание, что i может быть меньше 0. Значением выражения является значение условия j> = 0. Итак, если xLen меньше yLen, вы получите, что i будет равно некоторому отрицательному числу ,

Вы должны переписать этот цикл. Я думаю, вы имели в виду выражение

i >= 0 && j >= 0 
+0

Изменение этого параметра на && по-прежнему дает segfault. – Sunny

+1

Код недействителен. Я показал только один неправильный код. Код должен быть переписан целиком. –

+0

Пункт отметил. Благодарю. – Sunny

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