我正在编写一个测试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()
返回的值结果是一个空字符串?
答案 0 :(得分:0)
我认为问题是你在一个字符串中添加了一个int,你稍后会尝试将其解析为一个数字的有效ASCII表示。
有问题的行是
s += rem;
其中rem
为0
或1
,而非'0'
或'1'