1

我遇到了一个 C 语言程序,即使源文件被删除,它也会自行打印。但我不知道它是如何工作的。以下是此代码

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

任何人都可以通过解释每个步骤来帮助我吗?

4

2 回答 2

5

这个版本的 C 'quine'或自我复制程序不是严格有效的 C89,更不用说任何更新的东西了。但是,它适用于大多数系统。

理解它的关键是要知道字符 34 是双引号,".

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

使用字符串作为格式字符串的printf()打印,再次使用参数(或双引号)和 34(再次)。p34p

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

产生:

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

当它重新编译并运行时,它会自我复制。

此版本符合标准 C:

#include <stdio.h>
const char*s="#include <stdio.h>%cconst char*s=%c%s%c;%cint main(void){printf(s,10,34,s,34,10,10);}%c";
int main(void){printf(s,10,34,s,34,10,10);}

它使用换行符'\n'^J 是字符代码 10 以及 34 是双引号这一事实"

于 2013-03-10T17:58:56.280 回答
1

如果把上面程序中的 printf() 换成下面的,你能理解吗?

printf("char *p=%c%s%c;main() {printf(p,34,p,34);}",
      34, "a string", 34);
于 2013-03-10T17:56:51.543 回答