【问题标题】:What is difference between hex and char array print?十六进制和字符数组打印有什么区别?
【发布时间】:2015-07-26 05:04:21
【问题描述】:

我在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;
}

这里strhexvalue 都是指针,那么为什么当我尝试打印它们时它们都没有给出相同的输出?

【问题讨论】:

  • 编译该代码并打开警告,您就会得到答案。

标签: c arrays char printf format-specifiers


【解决方案1】:

%x 转换说明符将 单个 unsigned int 作为参数并将输出格式化为十六进制字符串。它不期望指针值,也不像%s 转换说明符那样遍历值数组。

您的循环是打印整个数组内容的唯一方法(尽管您应该使用转换说明符%hhx 来处理unsigned char 类型的值)。

【讨论】:

    【解决方案2】:

    printf("array %x \n", hexvalue);
    此行不会像您期望的那样打印整个数组
    它将打印数组的地址
    而数组的地址就是数组第一个索引的地址

    %x, %d 否则是控制台屏幕上显示的数字类型
    在这种情况下printf("array %x \n", hexvalue); 它将以十六进制类型打印数组的地址
    如果要打印地址,请使用 %p

    【讨论】:

      【解决方案3】:

      你的情况

      • printf("string %s \n", str);

      工作正常,因为%s 需要一个指向以空结尾的char 数组的指针,而str 是(或者,至少衰减到)一个。

      • printf("array %x \n", hexvalue);

      不起作用,因为 %x 期望 unsigned int 作为参数,而 hexvalue 不是。相反,它产生undefined behaviour

      参考:C11 标准,§7.21.6.1

      如果任何参数不是相应转换规范的正确类型,则行为未定义。

      另外,请注意,main() 的推荐签名是int main(void)

      【讨论】:

      • 所以我将 unsigned char 更改为 unsigned int 然后它工作?
      • @Jayesh 只有这种改变,不,它绝对行不通
      • 所以我需要循环来打印每个值,我已经完成了然后没有意义采取unsigned int
      • @Jayesh 您最好的选择是 1) 将 hexvalue 更改为数组以 unsinged int 2) 摆脱 printf("array %x \n", hexvalue);
      【解决方案4】:

      %x 格式说明符将无符号整数作为其输入,并以十六进制打印。它不会像您想要的那样使用指向数组的指针。

      因此,它应该打印的是十六进制值指针的地址,因为它只是将指针视为无符号整数。

      【讨论】:

      • 这不是真的。如果参数的类型与格式说明符不匹配,则会发生未定义的行为。
      • 现在我绞尽脑汁想弄清楚“未定义”的事物是如何真正“发生”的。
      • @poundifdef:“未定义”只是意味着编译器不需要以任何特定方式处理这种情况;结果可能是从垃圾输出到崩溃。