我想将int转换为char数组,其中0-7位的int是第一个字符8-15秒等



这就是代码但是由于某些原因,intToChar函数返回"abcd"最后还有一些胡言乱语。我试图改变我的新创建的数组为0,但然后我得到访问冲突错误。

int charToInt(char x[])
{
int z = 0;
for (int i = 0; i < sizeof(int) / sizeof(char) && x[i]; i++)
{
z <<= sizeof(char) * 8;
z |= x[i];
}
return z;
}
char* intToChar(int x)
{
char* z = new char[5];
for (int i = (sizeof(z) / sizeof(z[0]) - 1); i >= 0; i--)
{
z[i] = x;
x >>= sizeof(char) * 8;
}
return z;
}
int main()
{
char xd[5] = "abcd";
cout << xd;
cout << endl;
int x = charToInt(xd);
cout << x;
cout << endl;
char* y = intToChar(x);
cout << y;
cout << endl;
return 0;
}

正如评论中所指出的,您使用的sizeof(z)sizeof(a_pointer)——而不是您想要的。相反,考虑到sizeof(char)总是1,您可以简单地执行:

#include <iostream>
int charToInt (char *x)
{
int z = 0;

for (size_t i = 0; i < sizeof(int) && x[i]; i++)
{
z <<= 8;
z |= x[i];
}

return z;
}
char *intToChar (int x)
{
char *z = new char[5];

for (int i = (int)sizeof (int) - 1; i >= 0; i--)
{
z[i] = x;
x >>= 8;
}

return z;
}
int main()
{
char xd[5] = "abcd";
std::cout << xd << 'n';

int x = charToInt (xd);
std::cout << x << 'n';

char *y = intToChar(x);
std::cout << y << 'n';
}

(注意:循环限制已被调整,以反映您在转换中只使用4个字节的事实)

使用/输出示例

$ ./bin/chr2int2char
abcd
1633837924
abcd

或者,您可以这样写intToChar():

char *intToChar (int x)
{
char *z = new char[5];
int i  = sizeof (int);
z[i] = 0;               /* affirmatively nul-terminate z */

while (i--)
{
z[i] = x;
x >>= 8;
}

return z;
}

同样,如果你从main()以外的函数调用,你会想要确保你的delete[] y;避免内存泄漏,例如

char *y = intToChar(x);
std::cout << y << 'n';

delete[] y;

如果您还有问题,请告诉我。

你写的代码有几个问题:

  1. 你做:"(sizeof(z) / sizeof(z[0]) - 1)",但是'z'的大小是指针的大小,在大多数pc中是8字节。

  2. 您没有在字符串中设置空终止符,在char*

    的最后一个字节中

z[4] = '';

  1. 您忘记删除char*的动态分配,您应该在打印后在main函数中删除它

如果您将修复所有这些,它将像预期的那样工作,但是这里您有一个简单的代码来执行您的意思:

int charToInt(char x[])
{
int z = 0;
for (int i = 0; i < 4; i++)
{
z <<=  8;        
z |= x[i];
}
return z;
}

char* intToChar(int x)
{  
char* z = new char[5];
for(int i = 0; i < 4; ++i) {
z[i] = x >> (4 - i - 1) * 8;
}
z[4] = '';

return z; 
}

int main()
{
char xd[5] = "abcd";
cout << xd << endl;

int x = charToInt(xd);
cout << x <<endl;

char* y = intToChar(x);
cout << y << endl;
delete[] y;
return 0;
}

最新更新