如何将ANSI-C从unsigned int *转换为char *?

时间:2010-04-12 07:31:53

标签: c casting character-encoding printf

我希望这两个打印功能做同样的事情:

    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是unsigned int。通常情况下,我会更改类型,但问题是大多数数组都是数字,尽管特定部分应该打印为ASCII。目前,无符号数组打印为“A”,char数组打印为所需的“ABCDE”。

2 个答案:

答案 0 :(得分:1)

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

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

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

ff ef 41 42 43 44 45 00

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

如果您知道系统使用的是32位wchar_t,则可以使用l printf长度修改器。

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);
}

答案 1 :(得分:0)

正如迪特里希所说,一个简单的演员不会做,但你也不需要复杂的转换。只需循环遍历您的阵列。

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));