Another Self-reproducing C Program |
Deconstructing this program is going to be an exercise, after we have studied arrays of strings.
Self reproducing program: quine.c |
---|
1 #include<stdio.h> 2 char *a[] = {"\"};\n\n", 3 "main() {\n", 4 " int i=0; char *b;\n", 5 " printf(\"#include<stdio.h>\\nchar *a[] = {\\\"\");\n", 6 " while(*a[i]) {\n", 7 " for(b=a[i];*b;b++)\n", 8 " switch(*b) {\n", 9 " case '\\n': printf(\"\\\\n\"); break;\n", 10 " case '\\\\': case '\\\"': putchar('\\\\'); \n", 11 " default: putchar(*b);\n", 12 " } \n", 13 " printf(\"\\\",\\n\\t\\\"\"); \n", 14 " i++;\n", 15 " }\n", 16 " i=0;\n", 17 " while(*a[i]) {printf(a[i]);i++;}\n", 18 "}\n", 19 ""}; 20 21 main() { 22 int i=0; char *b; 23 printf("#include<stdio.h>\nchar *a[] = {\""); 24 while(*a[i]) { 25 for(b=a[i];*b;b++) 26 switch(*b) { 27 case '\n': printf("\\n"); break; 28 case '\\': case '\"': putchar('\\'); 29 default: putchar(*b); 30 } 31 printf("\",\n\t\""); 32 i++; 33 } 34 i=0; 35 while(*a[i]) {printf(a[i]);i++;} 36 } |
% cc -o quine4 quine4.c % quine4 > quine4_out.c % diff quine4.c quine4_out.c |