1

可能重复:
在 C 和 C++ 中通过 index[array] 访问数组

#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!

&a["%s"] 操作。这是如何运作的?与山高一起

4

2 回答 2

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"

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

希望这可以帮助!

于 2012-12-12T03:28:27.330 回答
1

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

"hello"[i]

这将评估为i字符串“hello”的第 th 个字符。例如,"hello"[1]让您可以访问存储e.

其次,你必须明白,在一个合法的a[i]表达式中ai可以在不改变表达式含义的情况下互换。这意味着

i["hello"]

也是合法的,还可以让您访问i字符串“hello”的第 th 个字符。所以,如果i等于2,则i["hello"]指第一个l

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

于 2012-12-12T03:44:33.983 回答