2011-10-07 10 views
15

私はthisサイトに自分自身を印刷するプログラムに出くわしました。つまり、プログラムコードを印刷します。それ自身を印刷するプログラムはどうですか?

#include <stdio.h> 
char *program = "#include <stdio.h>%cchar *program = %c%s%c;%cint main()%c{%cprintf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c return 0;%c}%c"; 
//what is this line doing, what is the use of %c and %s and what properties of %c and %s are being used here? 
int main() 
{ 
     printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); 
     //what is this print function doing, and how? 
     return 0; 
} 

そして、与えられた説明は次のとおりです:

プログラム・コードがある

ここでは二つの重要なトリックは、文字列が含まれていることができるように埋め込ま%sの 指定した文字列を使用しています には、特殊文字「 」を改行文字のように出力するための%c書式指定子を使用します。これは、出力 文字列には埋め込まれませんでした。

私はプログラムが動作しているか理解していませんでした。私は説明が必要な行、それがどのように働いているのか、そして何をしているのかを述べました。説明してください。

+0

です。これは宿題かプログラマーの挑戦ですか? –

+0

このようなものはありません。宿題の場合、私は宿題タグを使用していました。 – SpeedBirdNine

+0

あなたのコメントはquineを破る:)また、インデントはquineで正しくありません。これは歴史的に根ざしたプログラマーの挑戦です – sehe

答えて

6
char *program = "#include <stdio.h>%cchar *program = %c%s%c;%cint main()%c{%cprintf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c return 0;%c}%c"; 

ストリング及び%C及び%Sを格納するために使用される文字ポインタ名「プログラム」があり、それぞれ文字と文字列引数の書式指定されています。

printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); 

printf関数は、ここで printfのパラメータは、

  • プログラムを実行
  • 10を印刷する文字列を渡し、渡している」のNEWLINEおよび34のASCIIコードは10、コンソールに出力を印刷されています最初の%cのASCIIコード(改行文字に変換されます)
  • 同じ文字列をプログラムの%sに再度渡して、同じ文字列を再度印刷する
  • 10、10%ASCIIコードを3文字目の%cに変換する(改行文字に変換)
  • 10、ASCIIコードを10に渡す、34、2番目の%cの34 ASCIIコードを渡す(改行文字に変換されます)
  • 10文字コードに10 ASCIIコードを渡します(改行文字に変換されます)
  • 10、6番目の%cのASCIIコード10を渡します
  • 10、7%cのASCIIコード10を渡す(改行文字に変換される)
  • 10 、より良く理解するために、8%のC(文字改行に変換されます)
+1

あなたは34を忘れてしまった:-) –

2

のprintfを使用して、%のSまたは%Cを有する他の引数を代入する(この場合*programの文字列)は、最初の引数として与えられた文字列を出力

% sはarguementが文字列は、%Cであることを意味文字です。

メモは、それがプログラム文字列内のプログラム文字列のコピーを印刷するために、%Sを使用して、言うように - したがってコピーを作成し、文字10(改行)を印刷するために%のCを使用し、34 "

0

のための10のASCIIコードを渡し、変数programはこのように書かれている可能性:

"#include <stdio.h>\nchar *program = \"%s\";\nint main()\n..." 

アイデアがあること、ですプログラムを実行し、出力をコンパイルし、を実行して、プログラムなどを実行します。しかしこれは、改行の場合は%c値10、二重引用符の場合は34でのみ実行できます。

-1

これは、ファイル操作を使用して行うことができます。任意の名前でプログラムを保存し、その名前をfopenコマンドの開いたディレクトリに置きます。 私のプログラムの名前はhello.cppと似ています。

これは、私は、これは最近の回数を尋ねた見てきた次のプログラム

#include <stdio.h> 
#include <iostream> 
int main() 
{ 
    FILE *fp; 
    fp=fopen("hello.cpp","r"); 
    char ch; 
    while((ch=fgetc(fp))!=EOF) 
    { 
     printf("%c",ch); 
    } 
} 
関連する問題