我遇到了一个 C 语言程序,即使源文件被删除,它也会自行打印。但我不知道它是如何工作的。以下是此代码
char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";
main() {printf(p,34,p,34);}
任何人都可以通过解释每个步骤来帮助我吗?
我遇到了一个 C 语言程序,即使源文件被删除,它也会自行打印。但我不知道它是如何工作的。以下是此代码
char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";
main() {printf(p,34,p,34);}
任何人都可以通过解释每个步骤来帮助我吗?
这个版本的 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(再次)。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 是双引号这一事实"
。
如果把上面程序中的 printf() 换成下面的,你能理解吗?
printf("char *p=%c%s%c;main() {printf(p,34,p,34);}",
34, "a string", 34);