Программа, которая печатает себя, как она работает?

Я наткнулся на программу, которая печатает себя на этом сайте, то есть печатает программный код.

Программный код:

#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, чтобы разрешить печать специальных символов как новые строки, которые иначе не могли быть встроены в вывод строка.

Я не понял, как работает программа. Я упомянул о строках, в которых мне нужно объяснение, как они работают и что они делают. Пожалуйста, объясните.

Ответы

Ответ 1

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 имя указателя "программа", которое используется для хранения строки, а% c и% s - спецификаторы формата для char и строковых аргументов соответственно.

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

Функция printf выводит вывод на консоль, 10 здесь ASCII-код для NEWLINE и 34 для " Параметры printf выполняют

  • передача строки для печати
  • 10, передавая 10 ASCII-код для первого% c (будет преобразован в символ новой строки)
  • снова передав ту же строку в% s в программе, чтобы снова напечатать ту же строку
  • 34, передавая 34 ASCII-код для второго% c (будет преобразован в двойные Qout-символы)
  • 10, передавая 10 ASCII-код для 3% c (будет преобразован в новую строку символов)
  • 10, передавая 10 ASCII-код для 4% c (будет преобразован в новую строку символов)
  • 10, передавая 10 ASCII-код для 5% c (будет преобразован в новую строку символов)
  • 10, передавая 10 ASCII-код для 6% c (будет преобразован в символ новой строки)
  • 10, передавая 10 ASCII-код для 7-го% c (будет преобразован в символ новой строки)
  • 10, передавая 10 ASCII-код для 8-го% c (будет преобразован в новую строку символов)

Ответ 2

Printf печатает строку, указанную в качестве первого аргумента (в данном случае строку в *program), заменяя другие аргументы, в которых у вас есть% s или% c

% s означает, что аргумент является строкой,% c является символом.

Как отмечается в примечании, он использует% s для печати копии строки программы внутри строки программы - следовательно, делает копию и использует% c для печати символов 10 (новая строка) и 34 "

Ответ 3

Для лучшего понимания переменная program могла бы быть написана следующим образом:

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

Идея заключается в том, что вы запускаете программу, компилируете ее вывод, запускаете эту программу и так далее. Но это можно сделать только с значениями% c 10 для перевода строки и 34 для двойной кавычки.

Ответ 4

Это можно сделать с помощью обработки файлов. Сохраните программу с любым именем и поместите это имя в открытый каталог в команде 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);
     }
}