十六进制和字符数组打印有什么区别?
What is difference between hex and char array print?
我在c
中编写了以下程序
#include <stdio.h>
char str[]="hello world";
unsigned char hexvalue[] = {0x01,0x02,0x03,0x04,0x05};
int main()
{
int i;
printf("string %s \n", str);
printf("array %x \n", hexvalue); //This line not print whole array why?
for (i=0;i<sizeof(hexvalue);i++)
{
printf ("%x\n",hexvalue[i]);
}
return 0;
}
这里 str
和 hexvalue
都是指针那么为什么当我尝试打印它们时它们都没有给出相同的输出?
%x
格式说明符将 unsigned int 作为其输入并以十六进制打印。它不会像您想要的那样使用指向数组的指针。
因此,它应该打印的是 hexvalue 指针的十六进制地址,因为它只是将指针视为 unsigned int。
你的情况
printf("string %s \n", str);
工作正常,因为 %s
需要一个指向空终止 char
数组的指针,而 str
是( 或者至少衰减到 ) 一.
printf("array %x \n", hexvalue);
不起作用,因为 %x
需要一个 unsigned int
作为参数,而 hexvalue
不是。相反,它会产生 undefined behaviour.
参考:C11 标准,§7.21.6.1
If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
另外请注意,main()
推荐的签名是int main(void)
.
printf("array %x \n", hexvalue);
这一行不会像你期望的那样打印整个数组
它将打印数组的地址
并且数组的地址是数组第一个索引的地址
%x,%d 否则是将显示在控制台屏幕上的号码类型
在这种情况下 printf("array %x \n", hexvalue);
它将以十六进制类型打印数组的地址
如果你想打印地址使用 %p
%x
转换说明符将 single unsigned int
作为参数并将输出格式化为十六进制字符串。它既不期望指针值,也不以与 %s
转换说明符相同的方式遍历值数组。
您的循环是打印出整个数组内容的唯一方法(尽管您应该对类型 unsigned char
的值使用转换说明符 %hhx
)。
我在c
#include <stdio.h>
char str[]="hello world";
unsigned char hexvalue[] = {0x01,0x02,0x03,0x04,0x05};
int main()
{
int i;
printf("string %s \n", str);
printf("array %x \n", hexvalue); //This line not print whole array why?
for (i=0;i<sizeof(hexvalue);i++)
{
printf ("%x\n",hexvalue[i]);
}
return 0;
}
这里 str
和 hexvalue
都是指针那么为什么当我尝试打印它们时它们都没有给出相同的输出?
%x
格式说明符将 unsigned int 作为其输入并以十六进制打印。它不会像您想要的那样使用指向数组的指针。
因此,它应该打印的是 hexvalue 指针的十六进制地址,因为它只是将指针视为 unsigned int。
你的情况
printf("string %s \n", str);
工作正常,因为 %s
需要一个指向空终止 char
数组的指针,而 str
是( 或者至少衰减到 ) 一.
printf("array %x \n", hexvalue);
不起作用,因为 %x
需要一个 unsigned int
作为参数,而 hexvalue
不是。相反,它会产生 undefined behaviour.
参考:C11 标准,§7.21.6.1
If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
另外请注意,main()
推荐的签名是int main(void)
.
printf("array %x \n", hexvalue);
这一行不会像你期望的那样打印整个数组
它将打印数组的地址
并且数组的地址是数组第一个索引的地址
%x,%d 否则是将显示在控制台屏幕上的号码类型
在这种情况下 printf("array %x \n", hexvalue);
它将以十六进制类型打印数组的地址
如果你想打印地址使用 %p
%x
转换说明符将 single unsigned int
作为参数并将输出格式化为十六进制字符串。它既不期望指针值,也不以与 %s
转换说明符相同的方式遍历值数组。
您的循环是打印出整个数组内容的唯一方法(尽管您应该对类型 unsigned char
的值使用转换说明符 %hhx
)。