寻求与std :: invalid_argument类型的未捕获异常相关的运行时错误的建议:stoi:无转换

时间:2018-01-10 02:28:23

标签: c++ exception c++14

我正在编写一个测试C ++程序来找出两个数字之间的差异。

头文件 - code.hpp:

#ifndef CODE_HPP
#define CODE_HPP
#include<iostream>
#include<string>
#include<algorithm>
using std::cout;
using std::string;
using std::reverse;
using std::stoi;
using std::endl;

class calcDiffBits{
    public:
    calcDiffBits(int,int);
    ~calcDiffBits();
    private:
    void calc();
    string conv2Bin(int);
    int i;
    int j;
};

calcDiffBits::calcDiffBits(int n, int m):i(n),j(m){
    calc();
}

calcDiffBits::~calcDiffBits(){}

void calcDiffBits::calc(){
    string s1 = conv2Bin(i);
    string s2 = conv2Bin(j);

#ifdef DBG
    cout << "Binary Value of i:" << s1 << endl;
    cout << "Binary Value of j:" << s2 << endl;
#endif

    auto iBin = stoi(s1, nullptr, 2);
    auto jBin = stoi(s2, nullptr, 2);

    auto xorRes = iBin ^ jBin;

    auto diffCount = 0;
    do{
        xorRes >>= 1;
        ++diffCount;
    }while(xorRes);

    cout << i << " and " << j << " differ by " << diffCount << " bits.";
    cout << endl;
}

string calcDiffBits::conv2Bin(int n){
    auto rem = 0;
    string s = "";

    do{
        rem = n % 2;
        s += rem;
    }while(n /= 2);

    reverse(s.begin(), s.end());

    return s;
}
#endif

源文件 - main.cpp:

#include "code.hpp"
using std::cin;

int main(){
    int i, j;

    cout << "Enter the digits:";
    cin >> i >> j;
    calcDiffBits obj(i,j);
    return 0;
}

使用以下命令成功编译代码后:

g++ -DDBG -ggdb -std=c++14 -Wall main.cpp -o calcDiffBits

我在运行程序时发现我遇到了以下运行时错误:

  

libc ++ abi.dylib:以未捕获的类型异常终止   std :: invalid_argument:stoi:no conversion Abort trap:6

在使用代码中的调试打印进行调试时,我可以看到函数conv2Bin()返回的字符串是空字符串,因此会发生运行时错误。

我使用GDB进一步调试了函数conv2Bin(),并且发现函数内部采用的算法按预期工作。换句话说,每次变量rem中的值都会附加到string s

那么为什么从函数conv2Bin()返回的值结果是一个空字符串?

1 个答案:

答案 0 :(得分:0)

我认为问题是你在一个字符串中添加了一个int,你稍后会尝试将其解析为一个数字的有效ASCII表示。

有问题的行是

s += rem;

其中rem01,而非'0''1'