18

このサイトで自分自身を印刷するプログラム、つまりプログラムコードを印刷するプログラムに出くわしました。

プログラムコードは次のとおりです。

#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;
}

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

ここでの2つの重要なトリックは、%s指定子が埋め込まれた文字列を使用して、印刷時に文字列がそれ自体を含むようにすることと、%c形式指定子を使用して、改行などの特殊文字を印刷できるようにすることです。出力文字列。

プログラムがどのように機能しているか理解できませんでした。説明が必要な行、それらがどのように機能し、何をしているのかについて説明しました。説明してください。

4

4 に答える 4

8
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";

文字列を格納するために使用されるcharポインタ名「program」があり、%cと%sはそれぞれchar引数とstring引数のフォーマット指定子です。

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

printf関数はコンソールに出力を出力します。ここで10はNEWLINEのASCIIコードで、34は"printfパラメーターが実行しています

  • プログラム、印刷する文字列を渡す
  • 10、最初の%cに10個のASCIIコードを渡します(文字の改行に変換されます)
  • プログラム、同じ文字列をプログラム内の%sに再度渡して、同じ文字列を再度出力します
  • 34、2番目の%cに34のASCIIコードを渡します(文字のdouble qoutesに変換されます)
  • 10、3番目の%cに10個のASCIIコードを渡します(文字の改行に変換されます)
  • 10、4番目の%cに10個のASCIIコードを渡します(文字の改行に変換されます)
  • 10、5番目の%cに10個のASCIIコードを渡します(文字の改行に変換されます)
  • 10、6番目の%cに10個のASCIIコードを渡します(文字の改行に変換されます)
  • 10、7番目の%cに10個のASCIIコードを渡します(文字の改行に変換されます)
  • 10、8番目の%cに10個のASCIIコードを渡します(文字の改行に変換されます)
于 2011-10-07T17:56:02.073 に答える
2

Printfは、最初の引数として指定された文字列(この場合はの文字列*program)を、%sまたは%cがある他の引数に置き換えて出力します。

%sは引数が文字列であることを意味し、%cは文字です。

メモにあるように、%sを使用してプログラム文字列内のプログラム文字列のコピーを印刷します-したがってコピーを作成し、%cを使用して文字10(改行)と34を印刷します"

于 2011-10-07T17:46:04.670 に答える
0

理解を深めるために、変数は次のprogramように記述できます。

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

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

于 2011-10-07T18:06:47.713 に答える
-4

これは、ファイル処理を使用して実行できます。プログラムを任意の名前で保存し、その名前をfopenコマンドのopenディレクトリに配置します。私のプログラムの名前のように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);
     }
}
于 2016-09-19T22:01:35.173 に答える