Программа, которая печатает сама, как она работает?
Я столкнулся с программой, которая печатает себя на этом сайте, то есть она печатает код программы.
Код программы:
#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 ответа
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 (будет преобразован в символ двойных кавычек)
- 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 (будет преобразован в символ новой строки)
Printf печатает строку, заданную в качестве первого аргумента (в этом случае строка в *program
) подставляя другие аргументы, где у вас есть% s или% c
% s означает, что аргумент является строкой,% c является символом.
Как говорится в примечании, он использует% s для печати копии строки программы внутри строки программы - следовательно, делает копию, и использует% c для печати символов 10 (новая строка) и 34 "
Для лучшего понимания, переменная program
можно было бы написать так:
"#include <stdio.h>\nchar *program = \"%s\";\nint main()\n..."
Идея в том, что вы запускаете программу, компилируете ее вывод, запускаете эту программу и так далее. Но это можно сделать только с%c значениями 10 для перевода строки и 34 для двойной кавычки.
Это можно сделать с помощью обработки файлов. Сохраните программу под любым именем и поместите это имя в открытый каталог в команде 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);
}
}