我正在编写一个C ++函数来从Dec计算十六进制,但我不知道为什么我的字符串无法保存该值。有人能帮助我吗?
string DecToHex(int a){
int i=0,j=0;
string d,c;
while(a!=0)
{
i=a%16;
switch(i)
{
case 10:
d[j]='A';
break;
case 11:
d[j]='B';
break;
case 12:
d[j]='C';
break;
case 13:
d[j]='D';
break;
case 14:
d[j]='E';
break;
case 15:
d[j]='F';
break;
default:
d[j]=48+i;
break;
}
a=a/16;
j++;
}
cout<<"D="<<d;
return d;
}
答案 0 :(得分:2)
更改
d[j]='A';
要
d+='A'
对所有其他人也这样做。
答案 1 :(得分:1)
您实际上并没有为string
分配任何内存,因此使用d[j]
未定义的行为。您需要改为使用d += ...
或d.push_back(...)
。
但即使你修复了这个错误,你的代码仍然无法正常工作。当a=0
应该返回"0"
时,它根本不输出任何字符串值。它以相反的顺序返回其他字符串。例如,a=16
正在返回"01"
而不是"10"
,a=31
正在返回"F1"
而不是"1F"
,a=32
正在返回"02"
代替"20"
等。
尝试更像这样的东西:
#include <string>
std::string DecToHex(int a)
{
int i;
std::string d;
d.reserve(sizeof(a)*2);
do
{
i = a % 16;
if ((i >= 10) && (i <= 15))
d.insert(0, 1, 'A'+(i-10));
else
d.insert(0, 1, '0'+i);
a /= 16;
}
while (a != 0);
return d;
}
或者:
#include <string>
#include <algorithm>
std::string DecToHex(int a)
{
int i;
std::string d;
d.reserve(sizeof(a)*2);
do
{
i = a % 16;
if ((i >= 10) && (i <= 15))
d += ('A'+(i-10));
else
d += ('0'+i);
a /= 16;
}
while (a != 0);
std::reverse(d.begin(), d.end());
return d;
}
或者:
#include <string>
#include <sstream>
#include <algorithm>
std::string DecToHex(int a)
{
int i;
std::ostringstream oss;
do
{
i = a % 16;
if ((i >= 10) && (i <= 15))
oss << ('A'+(i-10));
else
oss << ('0'+i);
a /= 16;
}
while (a != 0);
std::string d = oss.str();
std::reverse(d.begin(), d.end());
return d;
}
在任何情况下,你的函数根本不处理负数,这需要一些额外的工作(在计算十六进制之前切换到2s补码表示)。我会把它作为练习让你锻炼。