字符串棘手的printf语句

时间:2012-12-12 03:25:49

标签: c arrays string

  

可能重复:
  Accessing arrays by index[array] in C and C++

#include <stdio.h>
int main()
{       
    int a=3, b = 5;
    printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
    printf(&a["WHAT%c%c%c  %c%c  %c !\n"], 1["this"],
    2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);

    return 0;
}

这是我在课堂上给出的练习题之一。我试图弄清楚这段代码是如何获得输出的,这是

您好!这怎么样?超 那是C!

&amp; a [“%s”]操作。这是如何运作的?与seco一起

2 个答案:

答案 0 :(得分:3)

代码

&a["Ya!Hello! how is this? %s\n"]

被解释为

&(a["Ya!Hello! how is this? %s\n"])

由于所有C风格的字符串都是指针,因此这是一个奇怪但合法的用法

arr[i]

i[arr]

在C中都是合法的。因此,代码应该被解释为

&("Ya!Hello! how is this? %s\n"[a])

a = 3以来,这就是角色H。因为我们取这个字符的地址,所以这给出了一个指向C风格字符串的指针

"Hello! how is this? %s\n"

以此为起点,您可以尝试解码程序的其余部分。

希望这有帮助!

答案 1 :(得分:1)

首先,您必须了解字符串文字是char个元素的数组。这意味着您可以像使用任何其他数组一样使用字符串文字。这是一个合法的C表达式

"hello"[i]

将评估字符串“hello”的i字符。例如,"hello"[1]可让您访问存储e的字符。

其次,您必须了解合法a[i]表达式ai可以在不改变表达式含义的情况下进行交换。这意味着

i["hello"]

也是合法的,并且还允许您访问字符串“hello”的i字符。因此,如果i等于2,则i["hello"]引用第一个l

现在,这已足以破译原始代码,假设您知道printf是什么以及它是如何工作的。