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