【问题标题】:How to ANSI-C cast from unsigned int * to char *?如何将 ANSI-C 从 unsigned int * 转换为 char *?
【发布时间】:2010-04-12 07:31:53
【问题描述】:

我希望这两个打印函数做同样的事情:

    unsigned int Arraye[] = {0xffff,0xefef,65,66,67,68,69,0};
            char Arrage[] = {0xffff,0xefef,65,66,67,68,69,0};
    printf("%s", (char*)(2+ Arraye));
    printf("%s", (char*)(2+ Arrage));

其中 Array 是一个无符号整数。通常,我会更改类型,但问题是大多数数组是数字,尽管特定部分应打印为 ASCII。目前,无符号数组打印为“A”,字符数组打印为所需的“ABCDE”。

【问题讨论】:

  • 为什么你的“字节”包含 16 位?
  • 我希望 0xffff
  • (unsigned int) 0xffff 在内存中是 0x0000ffff。 C 字符串以 null 结尾,它不会提供您所期望的。
  • @Kenny,一个字节不是 8位,它在标准中定义为字符类型的大小。对于@J16,您假设无符号整数是 32 位的,而不是可移植的假设。
  • @Michael,不在 ISO C 标准中。一个字节就是存储字符所需的位数。标准倾向于使用术语八位组来表示 8 位值。

标签: c casting character-encoding printf


【解决方案1】:

这就是unsigned int 版本在内存中的排列方式,假设为 32 位大端整数。

00 00 ff ff 00 00 ef ef 00 00 00 41 00 00 00 42
00 00 00 43 00 00 00 44 00 00 00 45 00 00 00 00

这就是char 版本在内存中的排列方式,假设为 8 位字符。请注意,0xffff 不适合 char

ff ef 41 42 43 44 45 00

所以你可以看到,铸造是不够的。您需要实际转换数据。

如果您知道您的系统使用 32 位 wchar_t,则可以对 printf 使用 l 长度修饰符。

printf("%ls", 2 + Arraye);

这不是便携式的。另一种方法是手动将unsigned int 数组复制到char 数组中,如下所示:

void print_istr(unsigned int const *s)
{
    unsigned int const *p;
    char *s2, *p2;
    for (p = s; *p; p++);
    s2 = xmalloc(p - s + 1);
    for (p = s, p2 = s2; *p2 = *p; p2++, p++);
    fputs(s2, stdout);
    free(s2);
}

【讨论】:

  • 感谢您的澄清,我最终做了这样的事情。
  • 我建议了另一种解决方案,因为我不喜欢为临时对象分配内存的函数。
【解决方案2】:

正如迪特里希所说,简单的演员阵容是行不通的,但你也不需要复杂的转换。简单地循环你的数组。

uint_t Arraye[] = {0xffff,0xefef,65,66,67,68,69,0};
  char Arrage[] = {0xffff,0xefef,65,66,67,68,69,0};

uint_t *p;
for(p = Arraye+2; p; p++)
  printf("%c", p);

printf("%s", (char*)(2+ Arrage));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2012-04-28
    • 2011-12-15
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多