2016-02-19 68 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; 

以下函数是通过字符串方法汇总两个大整数的函数。输入可以大于long long int的限制。我该如何解决它? libC++ abi.dylib:以std :: invalid_argument:stoi类型未捕获的异常终止:无转换

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的字符串将总是可以转换的,这在某些使用情况下可能是可能的)。

相关问题