2017-01-21 1 views
0

Ich helfe einem Freund mit einer C++ Zuordnung. Es gibt ein Problem mit der folowing Basiskonverterfunktion:Problem mit Basiskonverter-Funktion

#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; 
} 

Aus irgendeinem unerklärlichen Grunde jedesmal, wenn ich eingeben 3 und 5-stellige Dezimalzahlen und wählte Basis 10 ich die richtige Anzahl bin immer -1.

z.

100 
10 
99 

10000 
10 
9999 

Ich habe für die letzten 5-6 Stunden über diese Funktion wurde zu gehen und alle Arten von Debug-Code hinzufügen, sondern für das Wohl von mir, ich kann nicht herausfinden, was zum Teufel ist falsch.

Code-Stil Bemerkungen werden auch sehr geschätzt.

Prost

+0

@latedeveloper guten Punkt, um die magische Zahl. Viel besser lesbar. Allerdings sehe ich keinen Unterschied zwischen == und vergleichen(). Was meinen Sie, indem Sie den Rückgabewert testen? Validierung? Das ist keine Voraussetzung für die Aufgabe. Danke für die Rückmeldung. –

+0

Haben Sie versucht, Ihren Code mit einem Debugger zu durchlaufen? Debugger ist ** das ** Werkzeug, das verwendet wird, wenn der Code sich nicht korrekt verhält. –

+1

Ich kann nicht reproduzieren; mit Ihrer Eingabe bekomme ich 100-10-100 und 10000-10-10000 –

Antwort

2

std::pow tut Gleitpunktarithmetik. Sie bekommen wahrscheinlich irgendwo einen Rundungsfehler. Der üblicher Weg, Werte zu akkumulieren ist zu multiplizieren und jedes Mal durch die Schleife hinzu:

result *= base; 
result += ch - '0'; 
+0

Ja, viel elegantere Lösung, danke! –