Here is a Quine in ANSI C.
#include <stdio.h>
const char *data[] = {
" NULL};",
"",
"void print_string(const char *str)",
"{",
" const char *ptr;",
" printf(\" \\\"\");",
" for (ptr = str; *ptr != 0; ptr++)",
" if (*ptr == '\\\\')",
" printf(\"\\\\\\\\\");",
" else if (*ptr == '\"')",
" printf(\"\\\\\\\"\");",
" else",
" putchar(*ptr); ",
" printf(\"\\\",\\n\");",
"}",
"",
"int main(void)",
"{",
" const char **ptr;",
" printf(\"#include <stdio.h>\\n\\n\");",
" printf(\"const char *data[] = {\\n\");",
" for (ptr = data; *ptr != NULL; ptr++)",
" print_string(*ptr);",
" for (ptr = data; *ptr != NULL; ptr++)",
" printf(\"%s\\n\", *ptr);",
" return 0;",
"}",
NULL};
void print_string(const char *str)
{
const char *ptr;
printf(" \"");
for (ptr = str; *ptr != 0; ptr++)
if (*ptr == '\\')
printf("\\\\");
else if (*ptr == '"')
printf("\\\"");
else
putchar(*ptr);
printf("\",\n");
}
int main(void)
{
const char **ptr;
printf("#include <stdio.h>\n\n");
printf("const char *data[] = {\n");
for (ptr = data; *ptr != NULL; ptr++)
print_string(*ptr);
for (ptr = data; *ptr != NULL; ptr++)
printf("%s\n", *ptr);
return 0;
}
And here's another (much shorter) one:
#include <stdio.h>
char x[]="#include <stdio.h>%cchar x[]=%c%s%c;%cint main() {printf(x,10,34,x,34,10,10);return 0;}%c";
int main() {printf(x,10,34,x,34,10,10);return 0;}
Gg1