我希望这两个打印功能做同样的事情:
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”。
答案 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));