在我的课程幻灯片中,我有这个例子,但是没有太多的解释:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}我理解quine程序的一般含义,但我不太理解上面的代码中发生了什么。这是我运行它时得到的输出:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}但是它是如何复制自己的代码的呢?我真不明白产出是怎么产生的。
发布于 2020-02-13 17:04:05
首先,以一种更清晰的方式写出它(只改变布局):
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";
main()
{
printf(f,34,f,34,10);
}因此,我们看到了一个main函数(它应该返回一个int,但是您可以在C中使用not;同样,如果没有函数参数,也可以这样做)。在那之前,一根普通的绳子。这是一个看起来很有趣的字符串,但与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中进行替换,而不是像我在最后的代码中那样直接将它们放入字符串中。
https://stackoverflow.com/questions/60212717
复制相似问题