我正在帮助一位有C ++作业的朋友。下面的基本转换器功能存在问题:
#include <iostream>
#include <cmath>
using namespace std;
int strToInt(string num, unsigned base){
int result = 0;
for (int i=0; i<num.length(); i++) {
if (num[i]>='0' && num[i]<='9')
result += (num[i]-'0')*pow(base,num.length()-i-1);
else if (num[i]>='A' && num[i]<='F')
result += (num[i]-'A'+10)*pow(base,num.length()-i-1);
else if (num[i]>='a' && num[i]<='f')
result += (num[i]-'a'+10)*pow(base,num.length()-i-1);
}
return result;
}
int main()
{
string number;
int base;
while(number.compare("exit")!=0){
cin>>number;
cin>>base;
cout<<strToInt(number,base)<<"\n\n";
}
return 0;
}
由于某些莫名其妙的原因,每当我输入3位和5位小数并选择基数10时,我得到正确的数字-1。
E.g。
100
10
99
10000
10
9999
我在过去的5-6小时内一直在使用这个功能,并添加了所有类型的调试代码,但为了我的利益,我无法弄清楚到底是什么问题。
代码风格备注也非常受欢迎。
干杯
答案 0 :(得分:2)
std::pow
进行浮点数学运算。你可能在某处得到了一个圆整错误。累积值的常用方法是在循环中每次乘以并添加:
result *= base;
result += ch - '0';