2016-02-19 1 views
1
#define REP(i,a,b) for(int i = a; i < b; i++) 
#define FOR(i,n) REP(i,0,n) 
#include<iostream> 
#include<algorithm> 
#include<stdio.h> 
#include<string> 

using namespace std; 

Функция ниже представляет собой функцию, которая суммирует два больших целых числа по методу string. Вход может быть больше, чем предел длинного длинного int.Как я могу это исправить? libC++ abi.dylib: завершение с неперехваченным исключением типа std :: invalid_argument: stoi: no conversion

string string_add(string a, string b) { 
    string new_str = ""; 
    reverse(a.begin(), a.end()); 
    reverse(b.begin(), b.end()); 

    string long_s; 
    string short_s; 
    if (a.size() >= b.size()) { 
     long_s = a; 
     short_s = b; 
    } 
    else{ 
     long_s = b; 
     short_s = a; 
    } 
    int carry = 0; 
    int dif = long_s.size() - short_s.size(); 
    FOR(i, dif) 
     short_s += "0"; 
    FOR(i, long_s.size()) { 
     int hab = stoi(long_s.substr(i, 1)) + stoi(short_s.substr(i, 1)) + carry; 
     if (hab > 9) { 
      carry = 1; 
      hab -= 10; 
     } 
     else carry = 0; 

     new_str += to_string(hab); 
    } 
    if (carry != 0) new_str += to_string(carry); 
    reverse(new_str.begin(), new_str.end()); 
    return new_str; 
} 

И ниже основная часть.

int main() { 
    while(!cin.eof()){ 
     int n; 
     string dp[251]; 
     cin >> n; 
     dp[0] = 1; 
     dp[1] = 1; 
     REP(i,2,n) 
      dp[i] = string_add(string_add(dp[i-2], dp[i-2]), dp[i-1]); 
     cout << dp[n]; 
    } 
    return 0; 
} 

Problem

Как я могу исправить эту ошибку? Я думаю, что проблема заключается в «stoi» .. но я не знаю, как это исправить. Пожалуйста помоги.

+3

Похоже, что у вас есть цифры в ваших строках, такие как пробел или символ новой строки. – stark

ответ

1

От cppreference:

Исключения: зЬй :: invalid_argument, если преобразование не может быть выполнено

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

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