Un programme Quine est un programme qui produit une copie exacte de son propre code source lors de son exécution, sans utiliser d'opérations d'entrée/sortie pour lire le fichier source.
Voici un exemple fondamental en langage C :
#include <stdio.h>
char selfCode[]="#include <stdio.h>%cchar selfCode[]=%c%s%c;%cint main(){printf(selfCode,10,34,selfCode,34,10,10);}%c";
int main(){printf(selfCode,10,34,selfCode,34,10,10);}
Ce code se divise en trois parties : le préambule (incluant l'en-tête et le premier guillemet de la chaîne), la chaîne de caractères elle-même, et le suffixe (le guillemet fermant et le reste du code). La chaîne selfCode contient le modèle du programme complet, avec des spécificateurs de format %c et %s.
Pour gérer les caractères spéciaux, on utilise des valeurs ASCII : 10 pour le saut de ligne et 34 pour le guillemet double. Ainsi, la chaîne évite les séquences d'échappement complexes. Lors de l'affichage avec printf, le premier argument est le modèle, et les arguments suivants fournissent les valeurs pour %c et %s. Lorsque selfCode est imprimé via %s, il affiche littéralement le contenu sans interpréter à nouveau les spécificateurs de format.
Pour intégrer du contenu personnalisé, on peut ajouter une chaîne supplémentaire et l'incorporer dans le modèle. Par exemple, pour afficher "qwq" :
#include <stdio.h>
char code[]="#include <stdio.h>%cchar code[]=%c%s%c;%cchar extra[]=%c%s%c;%cint main(){printf(code,10,34,code,34,10,34,extra,34,10,10);}%c";
char extra[]="qwq";
int main(){printf(code,10,34,code,34,10,34,extra,34,10,10);}
Ici, la chaîne extra contient le texte personnalisé, et code la référence pour l'afficher. Pour des contenus plus longs, comme des dessins en caractères, on peut répartir le code sur plusiuers chaînes pour améliorer la lisibilité. Voici un exemple avec un tableau de chaînes pour un art textuel :
#include <stdio.h>
char src[]="#include <stdio.h>%cchar src[]=%c%s%c;%cchar art[2][50]={%c%c%s%c,%c%c%s%c};%cchar tail[]=%c%s%c;%c%s";
char art[2][50]={
" +-------+",
" | Hello |"};
char tail[]="int main(){printf(src,10,34,src,34,10,34,art[0],34,10,34,art[1],34,10,34,tail,34,10,tail);}";
int main(){printf(src,10,34,src,34,10,34,art[0],34,10,34,art[1],34,10,34,tail,34,10,tail);}
Cette approche permet de moduler le programme Quine en y intégrant des éléments arbitraires, tout en conservant la propriété d'auto-réplication.