【发布时间】:2010-11-17 08:07:57
【问题描述】:
我正在尝试将 int 的内存值复制到 char 缓冲区中。代码如下所示,
#define CPYINT(a, b) memcpy(a, &b, 4)
............
char str1[4];
int i = 1;
CPYINT(str1, i);
printf("%s",s);
...........
当我打印 str1 时,它是空白的。请澄清。
【问题讨论】:
我正在尝试将 int 的内存值复制到 char 缓冲区中。代码如下所示,
#define CPYINT(a, b) memcpy(a, &b, 4)
............
char str1[4];
int i = 1;
CPYINT(str1, i);
printf("%s",s);
...........
当我打印 str1 时,它是空白的。请澄清。
【问题讨论】:
您正在将整数的字节表示复制到 char 数组中。然后,您要求 printf 将此数组解释为空终止字符串:str1[0] 为零,您实际上是在打印一个空字符串(我在这里跳过了 endianness 谈话)。
你期待什么?显然,如果你想打印整数 i 的文本表示,你应该使用 printf("%d", i)。
【讨论】:
试试
printf("%02X %02X %02X %02X\n", str1[0], str1[1], str1[2], str1[3]);
改为。
整数 1 的二进制表示,可能包含前导 NUL,因此您当前的 printf 语句比您想要的更早终止。
【讨论】:
你在这里的意图是什么?现在,您正在将任意字节值放入 char 数组中,然后将它们解释为字符串,因为碰巧第一个字节可能为零(空),因此您什么也不打印,但很可能许多字符将是无法打印,因此 printf 是用于检查副本是否有效的错误工具。
因此,要么:遍历数组并打印每个字节的数值,%0xd 可能对此有用,或者如果您的意图实际上是创建 int 的字符串表示,那么您将需要更大的缓冲区,和空终止符的空间。
【讨论】:
也许您需要将 intger 转换为 char* 这样才能使用 itoa 函数 link text
【讨论】: