我有这个短代码片段:
unsigned BB[] = ???;
printf("%s\n", (char *) (BB + 1));
我希望printf的输出为“Red Ross!”。我不知道如何处理这类问题,我认为它与ASCII表有关。
以下是一些可以使用的假设:
答案 0 :(得分:2)
查看ASCII表中每个字母对应的代码可能会有所帮助,但不是必需的。您可以通过使用按位OR和位移来将字符文字分配给一个正好的整数:
uint32_t x = ('A' << 24) | ('B' << 16) | ('C' << 8) | 'D';
这会将'A'
置于最重要的字节中。在哪里取决于endianess。在小端上,上面会产生"DCBA"
。
这应该足以解决任务。请记住字符串是空终止的,因此您需要以零结束“字符串”。
答案 1 :(得分:2)
首先获取目标字符串并打印出每个字节的值:
char *str = "Red Ross!";
int i;
for (i=0; i<strlen(str); i++) {
printf("%02x ", str[i]);
}
这将告诉您要使用的值。然后,您可以使用这些值填充unsigned
数组。
因为unsigned
值是以32位小端实现的,所以每个元素可以存储4个字节,并且由于little-endian字节排序,这些字节需要按照它们应该显示的相反顺序存储
例如,如果您想在单个unsigned
中按顺序存储0x01,0x02,0x03和0x04,则可以按如下方式执行:
unsigned value = 0x04030201;
因此,使用这两条信息,您可以构建unsigned
数组。另外,因为你需要从BB + 1
开始,所以数组的第一个元素值并不重要。
最后,确保数组的最后一个元素为0,以便您的字符串为空终止。
答案 2 :(得分:2)
好吧,鉴于您已经牺牲了很多可移植性(围绕内置类型的大小,补充方案和字节序),为什么不去全面使用多字符常量?
int main(void) {
unsigned BB[] = {[1] = ' deR', 'ssoR', '!'}; // little endian
printf("%s\n", (char *) (BB + 1));
}
将会这样做,我已经对你的编译器实现多字符常量做了一些相当普遍的假设。请注意使用指定的初始化 [1]
。
将所有钓鱼活动保存在角色表中。
的工作示例