gpt4 book ai didi

c++ - 字符串长度不正确

转载 作者:太空宇宙 更新时间:2023-11-04 16:19:53 26 4
gpt4 key购买 nike

我正在将一个字节的十六进制值转换为它的 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;
}

输出:

Num digits: 3
adding 2
adding 5
adding 3
Num digits: 3
adding 1
adding 0
adding 0
Num digits: 2
adding 6
adding 4
Num digits: 2
adding 1
adding 5
Num digits: 1
adding 1
Len: 5 One: 253�)
Len: 6 two : 100�i
Len: 3 three : 64�
Len: 3 four : 15�
Len: 2 five : 1�

最佳答案

这是错误的:

string asciiNum = new char[len];

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

相反,您想要:

string asciiNum(len, '\0');

或者,如果您愿意,将其创建为空:

string asciiNum;

并使用push_back+=向其附加字符。

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

关于c++ - 字符串长度不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18278039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com