我遇到了一个用C编写的程序,即使删除了源文件也会自行打印。但我无法弄清楚它是如何工作的。以下是此
的代码char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";
main() {printf(p,34,p,34);}
任何人都可以通过解释每个步骤来帮助我吗?
答案 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);