即使删除源文件也会自行打印的程序

时间:2013-03-10 17:43:23

标签: c

我遇到了一个用C编写的程序,即使删除了源文件也会自行打印。但我无法弄清楚它是如何工作的。以下是此

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

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

2 个答案:

答案 0 :(得分: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()打印使用字符串p作为格式字符串,参数34(或双引号),再次p和34(再次)。< / p>

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是双引号"这一事实。

答案 1 :(得分:1)

如果上面程序中的printf()被替换为下面的那个,你能理解吗?

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