C++ 输出不是它应该是的
所以我正在开发一个程序,它要求我从包含十六进制值的字符数组中访问数据。在本例中,为了访问数据结构,我必须使用一个名为func()的函数。Func()包含3个指针变量,每种类型都不同,我可以使用它们中的任何一个来访问数组中的数据。无论我选择哪种数据类型,都会影响将存储到指针的值。代码如下:C++ 输出不是它应该是的,c++,memory,C++,Memory,所以我正在开发一个程序,它要求我从包含十六进制值的字符数组中访问数据。在本例中,为了访问数据结构,我必须使用一个名为func()的函数。Func()包含3个指针变量,每种类型都不同,我可以使用它们中的任何一个来访问数组中的数据。无论我选择哪种数据类型,都会影响将存储到指针的值。代码如下: unsigned char data[] { 0xBA, 0xDA, 0x69, 0x50, 0x33, 0xFF, 0x33, 0x40, 0x20, 0x10, 0x03, 0x30
unsigned char data[]
{
0xBA, 0xDA, 0x69, 0x50,
0x33, 0xFF, 0x33, 0x40,
0x20, 0x10, 0x03, 0x30,
0x66, 0x03, 0x33, 0x40,
}
func()
{
unsigned char *ch;
unsigned int i*;
unsigned short* s;
unsigned int v;
s = (unsigned short*)&data[0];
v = s[6];
printf("val:0x%x \n",v);
}
输出:
Val:0x366
这个输出的问题是它应该是0x0366,在3前面是零,但是它在printf语句中被截断,我不允许修改它。我还能怎么解决这个问题 使用指定前导零的格式:
%04x
如果不更改传递到
printf
的格式或完全替换它,恐怕无法影响输出。为什么不能修改printf
语句?0x366和0x0366是相同的数字。因此,您的输出是正确的。如果不允许您修改printf语句,那么您完全无法对其进行任何操作。不,不是在实际代码中,上面的代码是用于illustration@Rouke最好是发布实际代码,否则你会让人们纠正你在假装代码中犯的错误。或者更糟糕的是,不知道真实代码中的错误,但不知道假装代码中的错误。谢谢你的提问,这是关键的细节。抱歉,在这里为OP发言,但“我不允许修改printf语句”@john,这是答案。OP的愚蠢要求并不能改变这一点。是的,我知道这个解决方案,但谢谢。这可以帮助其他人。但是出于好奇,printf为什么要删掉0?如果数字为1或任何正整数,Printf将不会执行相同的操作。例如,如果s[1]被分配给v,那么输出将是0x5069。@Rouke,因为0
在这个上下文中没有任何意义1
的含义是有限的,因此删减它会改变答案。