ソースファイルが削除されても自分自身を印刷するCのプログラムに出くわしました。しかし、私はそれがどのように機能するかを知ることができませんでした。以下はこのためのコードです
char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";
main() {printf(p,34,p,34);}
誰かが各ステップを説明することによってこれを手伝ってくれる?
ソースファイルが削除されても自分自身を印刷するCのプログラムに出くわしました。しかし、私はそれがどのように機能するかを知ることができませんでした。以下はこのためのコードです
char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";
main() {printf(p,34,p,34);}
誰かが各ステップを説明することによってこれを手伝ってくれる?
このバージョンの C 'quine'または自己再生プログラムは厳密に有効な C89 ではありません。ただし、ほとんどのシステムで機能します。
それを理解する鍵は、文字 34 が二重引用符 . であることを知ることです"
。
char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";
main() {printf(p,34,p,34);}
文字列をフォーマット文字列として使用し、引数(または二重引用符)と 34 (再び)を使用printf()
して出力します。p
34
p
printf("char *p=%c%s%c;main() {printf(p,34,p,34);}", 34, p, 34);
これにより、次の結果が得られます。
char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";main() {printf(p,34,p,34);}
それを再コンパイルして実行すると、それ自体が再現されます。
このバージョンは標準 C に準拠しています。
#include <stdio.h>
const char*s="#include <stdio.h>%cconst char*s=%c%s%c;%cint main(void){printf(s,10,34,s,34,10,10);}%c";
int main(void){printf(s,10,34,s,34,10,10);}
'\n'
改行が ^J は文字コード 10 であり、34 は二重引用符であるという事実を利用しています"
。
上のプログラムの printf() を下のプログラムに置き換えると、わかりますか?
printf("char *p=%c%s%c;main() {printf(p,34,p,34);}",
34, "a string", 34);