In "Reflections on trusting trust" --- http://cm.bell-labs.com/who/ken/trust.html --- Ken Thompson urges the reader to try write a quine. If you haven't done so yet, please try before reading on.
Here are two quines I made (without cheating), loosely based on the same idea, that I wrote in C. The first one is macro-based, utilizing the ability for macros to quote parameters:
#define Q(x) #x;x
char *q=Q(main(){printf("#define Q(x) #x;x\nchar *q=Q(");printf(q);printf(")\n");})
Compiling and running it produces an exact copy of itself:
~/devel/quine csl$ gcc --no-warnings shortq.c -o shortq && ./shortq
#define Q(x) #x;x
char *q=Q(main(){printf("#define Q(x) #x;x\nchar *q=Q(");printf(q);printf(")\n");})
In the next quine I tried to do away with macros. First I tried quoting program code, but then I had to quote quotation characters, and for each compilation of the next quine, the quotation degraded quickly. The trick I used was just to use putchar instead. Not extremely elegant, but simple to understand:
char*p="main() {putchar(99);putchar(104);putchar(97);putchar(114);putchar(42);putchar(112);putchar(61);putchar(34);printf(p);putchar(34);putchar(59);putchar(10);put s(p);}";
main(){putchar(99);putchar(104);putchar(97);putchar(114);putchar(42);putchar(112);putchar(61);putchar(34);printf(p);putchar(34);putchar(59);putchar(10);put s(p);}
Compiling and running:
~/devel/quine csl$ gcc --no-warnings putchar-quine.c -o p && ./p
char*p="main(){putchar(99);putchar(104);putchar(97);putchar(114);putchar(42);putchar(112);putchar(61);putchar(34);printf(p);putchar(34);putchar(59);putchar(10);puts(p);}";
main(){putchar(99);putchar(104);putchar(97);putchar(114);putchar(42);putchar(112);putchar(61);putchar(34);printf(p);putchar(34);putchar(59);putchar(10);puts(p);}
Added this gist on my homepage at http://csl.sublevel3.org/two-quines-in-c/