2015-12-22 140 views
-1

我正在寫一個小程序轉換字符串的十六進制表示,它是一個提高我技能的kata。Codekata將數字從十六進制轉換爲十進制整數表示

這是我想出了

std::vector<int> decimal(std::string const & s) 
{ 

auto getint = [](char const k){ 
switch(k){ 
case 'f': 
return 15; 
case 'e': 
return 14; 
case 'd': 
return 13; 
case 'c': 
return 12; 
case 'b': 
return 11; 
case 'a': 
return 10; 
case '9': 
return 9; 
case '8': 
return 8; 
case '7': 
return 7; 
case '6': 
return 6; 
case '5': 
return 5; 
case '4': 
return 4; 
case '3': 
return 3; 
case '2': 
return 2; 
case '1': 
return 1; 
case '0': 
return 0; 
}; 

std::vector<int> result; 

for(auto const & k : s) 
{ 
result.push_back(getint(k)); 
} 

return result; 

} 

我是否有這樣做想以另一種方式。我也考慮過使用std :: map作爲東西,但我不確定哪一個可能會更快。如果有另一種方法可以做到這一點,請添加它。

請記住,我正在做這個代碼卡塔來提高我的技能,並學習。

謝謝TIA!

+1

在擔心速度之前,您應該擔心正確性。當它應該是'{1,7,0}'時,你將'aa'轉換爲'{10,10}'。 – molbdnilo

+0

你有正確性問題,但會很高興檢查這個http://stackoverflow.com/questions/34365746/whats-the-fastest-way-to-convert-hex-to-integer-in-c/34366370#34366370爲了快速寫出getint() – g24l

回答

1

首先,你也許可以簡化你的邏輯,像這樣:

auto getint = [](char const k){ 
    if(k >= 'a' && k <= 'f') return (k - 'a'); 
    else if(k >= 'A' && k <= 'F') return (k - 'A'); 
    else if(k >= '0' && k <= '9') return (k - '0'); 
    else return -1; 
} 

除此之外,可能存在一個標準庫函數,正是這一點,你可能會根據您的具體需求偏好。

0

您可以使用strtol or strtoll來完成從base16字符串轉換爲整數值的大部分繁重工作。

然後使用stringstream對象轉換回常規字符串。

// parse hex string with strtol 
long value = ::strtol(s.c_str(), nullptr, 16); //not shown - checking for errors. Read the manual page for more info 

// convert value back to base-10 string 
std::stringstream st; 
st << value; 
std::string result = st.str(); 

return result; 
0

對於十進制數字是非常容易的字符轉換爲其數字,因爲C++規範指出,所有數字必須在所有編碼連續的,與'0'是最低和'9'最高。這意味着您可以通過減去'0'來將字符轉換爲數字,例如k - '0'。儘管對這些字母沒有這樣的要求,但最常見的編碼(ASCII)也是如此,但如果您想要可移植,則不應該將其列入考慮範圍。

你也可以用它做。 std::transformstd::back_inserter,所以不需要你自己的循環。也許類似

std::transform(std::begin(s), std::end(s), std::back_inserter(result), getint); 

getint函數中,您可以使用例如, std::isxdigitstd::isdigit分別檢查字符是否是有效的十六進制或十進制數字。您應該可以使用例如如果十六進制數字是大寫,則爲std::tolower

相關問題