C++ 字符串长度不正确

C++ 字符串长度不正确,c++,cstring,C++,Cstring,我正在从一个单字节十六进制值转换为它的ascii表示形式,但当我试图打印出结果字符串时,由于某种原因,长度是错误的 以下是我生成的代码和输出: #include <math.h> #include <string.h> unsigned char numDigits(unsigned char aNum) { unsigned char digits = 0x00; while (aNum) { // printf("aNum: %

我正在从一个单字节十六进制值转换为它的ascii表示形式,但当我试图打印出结果字符串时,由于某种原因,长度是错误的

以下是我生成的代码和输出:

#include <math.h>
#include <string.h>

unsigned char numDigits(unsigned char aNum)
{
    unsigned char digits = 0x00;
    while (aNum)
    {
      //  printf("aNum: %d\n",aNum);
        aNum /= 0x0a;
        digits++;
    }
    if(digits == 0x00)
      return 1; // aNum was 0 but we still need to send the ascii representation of 0 so set lengeth to 1
    return digits;
}

string numToAscii(unsigned char aNum)
{
  int len = numDigits(aNum);
  printf("Num digits: %d\n", len);
  string asciiNum = new char[len];
  for(int i = 0; i < len; i++)
  {
    int nthPlace = (int)pow(10.0,(len-(i+1)));  
    int nthNum = aNum/nthPlace;
    asciiNum[i] = nthNum+0x30;
    printf("adding %c\n", asciiNum[i]);
    aNum-=nthNum*nthPlace;
  }
  return asciiNum;
}

int main ()
{
unsigned char one = 0xfd;
unsigned char two = 0x64;
unsigned char three = 0x40;
unsigned char four = 0x0f;
unsigned char five = 0x01;

string cone = numToAscii(one);
string ctwo= numToAscii(two );
string cthree = numToAscii(three );
string cfour = numToAscii(four );
string cfive= numToAscii(five );

printf("Len: %d One: %s\n", cone.length(), cone.c_str());
printf("Len: %d two : %s\n", ctwo.length(), ctwo.c_str());
printf("Len: %d three : %s\n", cthree.length(), cthree.c_str() );
printf("Len: %d four : %s\n", cfour.length(), cfour.c_str() );
printf("Len: %d five : %s\n",cfive.length(), cfive.c_str());

return 0;
}

这是因为您错误地初始化了字符串。当你打电话的时候

string asciiNum = new char[len];
您正在使用未初始化的数据初始化字符串,并且还创建了内存泄漏,因为您从未调用
new char[len]
上的
delete[]

换成

string asciiNum(len, '0');

来解决问题。

发生这种情况是因为您错误地初始化了字符串。当你打电话的时候

string asciiNum = new char[len];
您正在使用未初始化的数据初始化字符串,并且还创建了内存泄漏,因为您从未调用
new char[len]
上的
delete[]

换成

string asciiNum(len, '0');
来解决问题。

这是错误的:

string asciiNum = new char[len];

当你从C样式字符数组初始化C++字符串时,它假定数组被终止-也就是说,有一个零值字节来标记字符串的结尾。这里不是这种情况-您分配一些内存(充满垃圾),尝试从中初始化字符串(结果未定义,因为它可能找不到终止符),然后泄漏内存,因为您丢失了指向它的唯一指针

相反,您希望:

string asciiNum(len, '\0');
或者,如果愿意,将其创建为空:

string asciiNum;
并使用
push_back
+=
向其添加字符

(这假设
string
是标准库中的类,即使您没有包含
或使用
std::
对其进行限定。也许您的库已经过期二十年了?

这是错误的:

string asciiNum = new char[len];

当你从C样式字符数组初始化C++字符串时,它假定数组被终止-也就是说,有一个零值字节来标记字符串的结尾。这里不是这种情况-您分配一些内存(充满垃圾),尝试从中初始化字符串(结果未定义,因为它可能找不到终止符),然后泄漏内存,因为您丢失了指向它的唯一指针

相反,您希望:

string asciiNum(len, '\0');
或者,如果愿意,将其创建为空:

string asciiNum;
并使用
push_back
+=
向其添加字符


(这假设
string
是标准库中的类,即使您没有包含
或使用
std::
对其进行限定。也许您的库已经过期二十年了?

因为没有其他人发布过它,您是否尝试过:

int main ()
{
unsigned char one = 0xfd;
std::cout << static_cast<unsigned int>(one) << std::endl;
return 0;
}
int main()
{
无符号字符1=0xfd;

std::cout因为没有其他人发布过,您是否尝试过:

int main ()
{
unsigned char one = 0xfd;
std::cout << static_cast<unsigned int>(one) << std::endl;
return 0;
}
int main()
{
无符号字符1=0xfd;


STD:CUD<代码>字符串ASCISIN =新的char [Le];让我哭了一点。这是一个家庭作业问题还是有什么你真正想做的?<代码>字符串asCiNIN =新char [LeN+1 ];<代码> Addio>代码> NUL结尾。我有太多的空闲时间,其他的还有更多。@ GrijeshChauhan:C++字符串(假设这就是这个
字符串
是什么)不需要显式终止;从
len+1
字节垃圾中初始化一个垃圾就像从
len
字节中初始化一个垃圾一样不正确。@MikeSeymour是的,Mike我的答案也是错误的,所以我删除了..谢谢你的答案,我意识到了。
string ascinum=new char[len]让我哭了一点。这是一个家庭作业问题还是有什么你真正想做的?<代码>字符串ascIn=新char [LeN+1 ];< /COD> <代码> NUL终止时间太多,其他的还有更多。@ GrijeshChauhan:C++字符串(假设这是代码<字符串> /COD>)不需要显式终止;从垃圾的
len+1
字节初始化一个与从
len
字节初始化一个一样不正确。@MikeSeymour是的,Mike我的答案也错了,所以我删除了..谢谢你的答案,我意识到了。
string ascinum(len)
?@P0W:你在问什么?这会初始化字符串,使其长度为
len
。你的意思是
字符串ascinum(len,'0');
对吧?没有这样的构造函数只取
大小
。@P0W:所以没有;我不知道。
字符串ascinum(len);
?@P0W:你在问什么?那将字符串初始化为长度为
len
。你的意思是
string ascinum(len,'0'))
对吗?没有这样的构造函数只取
大小
@P0W:所以没有;我不知道。从OP代码的复杂性来看,我确信他知道如何在不编写太多代码的情况下完成它,而这段代码是一个学习练习。@dasblinkenlight可能是的,但实际上没有问题。从由于OP代码的复杂性,我确信他知道如何在不编写太多代码的情况下完成这项工作,而且这项代码是一项学习练习。@DasbLinkedLight可能是的,但实际上没有问题。