逐字节打印出结构的值

时间:2019-01-21 02:07:47

标签: c

基本上,我正在尝试将char数组强制转换为指向结构的指针,并逐字节打印出该结构中的值。这是因为我正在处理的某些旧版代码使用宏进行了一些按位移位和屏蔽,以更改结构中整数内的4位,并且我试图找出宏是否按预期工作。但是,我已经将问题压缩到了这个玩具示例中-

const

由于某种原因,这会打印出两个字符(显示为其中带有0014的框),而没有其他内容。如果将for循环从0更改为5(大约是我期望的for循环的界限),我将得到完全相同的输出。有没有一种方法可以做我想要的事情(即让它打印出5个字符)?我知道有些字符只是空白,但我不明白我怎么没说空白。

2 个答案:

答案 0 :(得分:5)

您正在尝试将二进制值打印为字符。如何打印这些字符取决于您的控制台,但是字节值0通常不会打印任何内容。

如果要查看字节的值,则将它们打印为十六进制数字:

printf("%02x ",((char*)&p1)[i]);

答案 1 :(得分:0)

详细了解ASCII。有些字符是control characters,所以不能很好地显示,并且您的系统可能有一些奇怪的character encoding。请注意,比起2019年,UTF-8 is used everywhere(几乎)。

您最好以十六进制打印字节:

  printf("%02x",(unsigned int) ((char*)&p1)[i]);

,并且您可能会使用带有签名的char -s的实现,因此最好将char*替换为显式的unsigned char*(甚至可以将{{ {3}})。请注意,据记录,<stdint.h>uint8_t*想要一个无符号整数(而不仅仅是%02x)。其他任何东西都可以是printf

至少请访问某些undefined behavior网站,并考虑研究C11标准C reference

当然,请在编译器中启用所有警告和调试信息(使用n1570,编译GCC char)并使用调试器(例如with)。因此,请阅读use gdb