2015-12-22 99 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

相关问题