2014-09-30 20 views
-1

我試圖將十六進制值轉換爲十進制。我只是試圖提取一個數字(0-9)或字母(AF),我將其轉換爲數值與另一個函數,然後將值推入堆棧(我可以使用矢量,但這次選擇了堆棧)。然後我只是想獲得十進制值,並且由於一個堆棧反向工作,它應該是有序的。C++:十六進制到十進制轉換功能 - 沒有得到正確的輸出

正確的輸出,如下圖所示,應該是1728,但我事先得到12

感謝。

#include <iostream> 
#include <string> 
#include <math.h> 
#include <stack> 

using namespace std; 

int hexCharToDec(char a); 
void hexToDecimal(string str, stack<int> & myStack); 

int main(){ 

    stack<int> myStack; 
    string str = "6C0"; // should be 1728 
    hexToDecimal(str, myStack); 

} 

void hexToDecimal(string str, stack<int> & myStack){ 

    int totalVal = 0; 

    for (int i = 0; i < str.length(); i++){ 

     if (str.at(i) <= 9) 
     myStack.push(str.at(i)); 

     else if (str.at(i) >= 'A' && str.at(i) <= 'F') 
     myStack.push(hexCharToDec(str.at(i))); 
    } 

    int k = 0; 

    for (int i = 0; i < myStack.size(); i++){ 
     totalVal += (myStack.top() * pow(16, k++)); 

     myStack.pop(); 

    } 
    cout << totalVal; 
} 

int hexCharToDec(char hexChar){ 

    switch(hexChar){ 

     case 'A': 
     return 10; 
     break; 

     case 'B': 
     return 11; 
     break; 

     case 'C': 
     return 12; 
     break; 

     case 'D': 
     return 13; 
     break; 

     case 'E': 
     return 14; 
     break; 

     case 'F': 
     return 15; 
     break; 
}} 
+0

什麼簡單地用'的std :: hex' IO-操縱? – 2014-09-30 19:27:02

+0

我不得不說,代碼對於它的功能非常複雜。我會尋找方法來簡化它(不依靠內置函數,因爲我認爲這會破壞練習的重點)。 – NPE 2014-09-30 19:33:36

+1

... aaand代碼被修改以修復第一個問題並且遇到新問題 – 2014-09-30 19:35:27

回答

4

在您發佈的代碼的原始版本中,您將0'0'混淆,對於其他數字也是如此。輸出爲12,因爲如果您採用6C0並忽略60,結果爲C12

在更新的版本這個循環被打破:

for (int i = 0; i < myStack.size(); i++) 
{ 
    totalVal += (myStack.top() * pow(16, i)); 
    myStack.pop(); 
} 

當你做pop(),它減少size()。所以你只能處理堆棧中一半的數字(四捨五入)。要解決此問題,請循環,直到myStack.size() == 0

+0

+1或直到'myStack.empty()'方式。 – WhozCraig 2014-09-30 19:42:12

+0

需要在for條件中將'i SHR 2014-09-30 19:42:30

+3

並且將問題代碼更改爲... ** **。 – WhozCraig 2014-09-30 19:45:06

2

問題是您輸入的字符不在您的if語句的範圍內。數字字符沒有值0 - 9,它們是'0' - '9' - 完全不同。這些角色根本沒有得到處理。

此外,您的for循環正在循環堆棧的大小 - 但堆棧的大小隨着彈出結束而改變。你只處理一半的輸入。

0

A工作液:

#include<iostream> 
#include <string> 
#include <sstream> 
int main() 
{ 
    int n; 
    string str = "6C0"; 
    istringstream sin(str); 
    sin>>hex>>n; 
    cout<<n<<endl; 
    return 0; 
} 
+0

這不能處理與原始代碼一樣寬的範圍(例如'INT_MAX + 1') – 2014-09-30 19:51:03

相關問題