программа, которая печатает сама, как она работает? - PullRequest
18 голосов
/ 07 октября 2011

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

Код программы:

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

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

Ответы [ 4 ]

8 голосов
/ 07 октября 2011
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 являются спецификаторами формата для аргументов char и string соответственно.

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 (будетпреобразуется в двойные символы q)
  • 10, передавая код 10 ASCII для 3-го% c (будет преобразован в символ новой строки)
  • 10, передавая код 10 ASCII для 4-го% c (будетпреобразуется в символ новой строки)
  • 10, передается 10 ASCII-код для 5-го% c (будет преобразован в символ новой строки)
  • 10, передается 10 ASCII-код для 6-го% c (будет преобразован вчараcter newline)
  • 10, передавая 10 ASCII-код для 7-го% c (будет преобразован в символьную новую строку)
  • 10, передавая 10 ASCII-код для 8-го% c (будет преобразован в символьную новую строку)
2 голосов
/ 07 октября 2011

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

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

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

0 голосов
/ 20 сентября 2016

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

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

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

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

...