我正在Windows上使用VS 2010。我有一个使用char
指针的函数。现在,在函数内部,我正在调用std::hex
将其转换为十进制,但是由于某种原因,它无法正常工作。它输出一个很大的值,这使我认为它正在转换地址。
void convertHexToDec(char* hex, char * dec)
{
long long decimal;
std::stringstream ss;
ss << hex;
ss >> std::hex >> decimal;
sprintf (dec, "%llu", decimal);
}
因此,如果传入包含char
的{{1}}指针,则输出的十进制值类似于"58"
。看起来它正在转换十六进制的地址。
我也尝试过以下方法:
1D34E78xxxxxxxxx
以上方法均无效。
有什么想法可以使该功能正常工作吗?
答案 0 :(得分:2)
除了您没有使用std::string
和参考外,我还尝试了以下代码:
#include <iostream>
#include <sstream>
void convertHexToDec(char* hex, char* dec)
{
long long decimal;
std::stringstream ss;
ss << hex;
ss >> std::hex >> decimal;
std::cout << "Decimal: " << decimal << "\n";
sprintf (dec, "%llu", decimal);
}
int main()
{
char hex[] = "58";
char dec[4];
convertHexToDec(hex, dec);
std::cout << "Output string: " << dec << "\n";
}
输出:
Decimal: 88
Output string: 88
那你怎么了?
答案 1 :(得分:2)
错误的原因很可能是错误的printf
指定符。此外,sprintf
是不安全的:它假定目标缓冲区(dec
)足够大。
使用函数签名的可能解决方案-不建议使用,因为您不知道目标的大小:
void convertHexToDec( char* hex, char * dec )
{
std::sprintf( dec, "%lld", std::strtoll( hex, 0, 16 ) );
}
安全的解决方案:
std::string convertHexToDec( const char* h )
{
return std::to_string( std::strtoll( h, 0, 16 ) );
}
使用流的安全解决方案:
std::string convertHexToDec( const char* h )
{
long long lld;
std::istringstream( h ) >> std::hex >> lld;
std::ostringstream os;
os << lld;
return os.str();
}