-1

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

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);}

但是它是如何重现自己的代码的呢?我真的不明白输出是如何产生的。

4

1 回答 1

3

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

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>, 和"' \"s 以使其实际作为独立语句工作):

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

看看那个! main简单地打印出我们首先开始的行。欢呼!


编辑添加:

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

于 2020-02-13T17:04:05.103 回答