【问题标题】:String tricky printf statement [duplicate]字符串棘手的 printf 语句 [重复]
【发布时间】:2012-12-12 03:25:48
【问题描述】:

可能重复:
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!

&a["%s"] 操作。这是如何运作的?和seco一起

【问题讨论】:

标签: c arrays string


【解决方案1】:

代码

&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"

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

希望这会有所帮助!

【讨论】:

  • 谢谢!这有帮助。但是你能解释一下 arr[i] 和 i[arr] 的关系吗?你是说 arr[5] 也可以是 5[arr] 吗?它们是等价的吗?
  • @Nopiforyou- 是的! arr[i] = *(arr + i) = *(i + arr) = i[arr].
  • 哇,谢谢。我不禁想知道这是常见的还是 C 的一个不起眼的部分。我以前绝对从未见过这样写。
  • @Nopiforyou- 这太荒谬了。我教一门 CS 课程,但绝不会在里面放这样的东西……你几乎永远不会看到这样的代码。
  • @Nopiforyou:这在现实生活中的代码中很少见,但作为一种好奇心非常有名。基本上,这是一个过度使用的 C 轶事。
【解决方案2】:

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

"hello"[i]

这将评估为字符串“hello”的ith 字符。例如,"hello"[1] 允许您访问存储 e 的字符。

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

i["hello"]

也是合法的,并且还允许您访问字符串“hello”的ith 字符。所以,如果i等于2,那么i["hello"]指的是第一个l

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2010-11-16
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多