C 中的 Quine 程序示例

Quine Program Example in C

在我的课程幻灯片中,我有这个例子,但没有太多解释:

char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}

我明白 quine programs 的一般意思,但我不太明白上面的代码中发生了什么。这是我 运行 得到的输出:

char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}

但它是如何复制自己的代码的?我不太明白输出是如何产生的。

首先以更清晰的方式写出来(除了布局之外不改变任何东西):

char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";

main()
{
    printf(f,34,f,34,10);
}

所以我们看到了一个 main 函数,正如我们所期望的(它应该 return 一个 int 但你可以在 C 中使用 not ;同样对于 no函数参数)。 在那之前,一个普通的字符串。这是一个看起来很有趣的字符串,但它与 char*f="fish";.

并没有什么不同

好吧,如果我们通过手动将字符串放在那里来扩展 printf 呢?

printf("char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c" ,34,f,34,10);

我们可以看到它会打印出一些废话,并在此过程中替换一些值。他们是:

 First %c : 34   (the ASCII code for " (quotes))
 First %s : 'f'  (our string, once again)
Second %c : 34   (" again) 
 Third %c : 10   (the ASCII code for Newline)

让我们也将它们全部替换掉​​(虽然我已经将字符串的内容替换为 <the string>,并将 " 替换为 \" 以使其实际作为独立声明工作):

main()
{
    printf("char*f=\"<the string>\";main(){printf(f,34,f,34,10);}\n");
}

好吧,看看那个! main 简单地打印出我们开始的那一行。万岁!


编辑添加:

虽然我基本上已经为你拼出了答案,但还有一个谜题。自己考虑一下为什么我们费心在 34, f, 34, 10 中进行替换,而不是像我在最终代码中所做的那样将它们直接放入字符串中。