1

ソースファイルが削除されても自分自身を印刷するCのプログラムに出くわしました。しかし、私はそれがどのように機能するかを知ることができませんでした。以下はこのためのコードです

char *p="char *p=%c%s%c;main() {printf(p,34,p,34);}";
main() {printf(p,34,p,34);}

誰かが各ステップを説明することによってこれを手伝ってくれる?

4

2 に答える 2

5

このバージョンの 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()して出力します。p34p

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 は二重引用符であるという事実を利用しています"

于 2013-03-10T17:58:56.280 に答える
1

上のプログラムの printf() を下のプログラムに置き換えると、わかりますか?

printf("char *p=%c%s%c;main() {printf(p,34,p,34);}",
      34, "a string", 34);
于 2013-03-10T17:56:51.543 に答える