我不知道为什么我的字符串无法保存值

时间:2017-05-17 14:06:19

标签: c++ string

我正在编写一个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;
}

2 个答案:

答案 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补码表示)。我会把它作为练习让你锻炼。