如何找到无符号BB []使得(char *)(BB + 1)=“Red Ross!”

时间:2018-01-29 13:34:26

标签: c

我有这个短代码片段:

 unsigned BB[] = ???; 
 printf("%s\n", (char *) (BB + 1));

我希望printf的输出为“Red Ross!”。我不知道如何处理这类问题,我认为它与ASCII表有关。

以下是一些可以使用的假设:

  • 32位小端平台
  • sizeof(char)== 1
  • sizeof(unsigned)== 4

3 个答案:

答案 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]

将所有钓鱼活动保存在角色表中。

https://ideone.com/9DiFgy

的工作示例