我有一个问题,我尝试使用以下代码将数字转换为十六进制。
int numconvert(string hexnum)
{
stringstream converter(hexnum);
unsigned int value = 0;
converter >> hex >> value;
return value;
}
string hexconvert(int hexnum)
{
stringstream ss;
ss << hex << hexnum;
string n;
ss >> n;
return n;
}
我使用numconvert将输入从string更改为int,然后使用hexconvert将其更改为十六进制并将其存储为字符串。
一切似乎工作得很好但是出于某种原因,当我通过它4096时,它给了我4096年。我期待1000但我不确定为什么它错误对我。我给它4096并且我注意到它返回一个16534的int,然后程序将它发送到hexconvert并返回4096,这在技术上是正确的,但不是我想要的。
似乎处理其他数字就好了。我在这里做错了什么?
答案 0 :(得分:2)
我认为那里有一个逻辑错误。如果你写:
int n = numconvert("4096");
std::string s = hexconvert(n);
你基本上告诉它将“4096”解释为十六进制数,因为你在converter >> hex >> value;
内得到numconvert
,将它转换回十六进制总会导致同样的返回。
你想要的可能是
int n = std::stoi("4096");
std::string s = hexconvert(n);
这会将“4096”解释为普通基数10,然后使用hexconvert
将其转换为十六进制字符串。
那说你的numconvert
可以写得更短,使用std::stoi也可能更有效率,它基本上只是:
int numconvert(const std::string& str)
{
return std::stoi(str, nullptr, 16);
}
我们不需要第二个参数,所以我们传递nullptr
,第三个参数是基础。
答案 1 :(得分:0)
尝试使用str
成员而不是提取运算符,从字符串流中弹出字符串。除了更直接之外,您不必担心提取器如何进一步解释事物。