Quine Confusion.What на самом деле печатает Quine? - PullRequest
0 голосов
/ 05 сентября 2010

Печатает ли quine АКТУАЛЬНЫЙ код программы, т.е. не запутанный, или печатает запутанную программу?

Ответы [ 5 ]

7 голосов
/ 05 сентября 2010

Я не думаю, что запутывание имеет какое-либо отношение к этому. Обычно quine печатает фактический исходный код самой программы.

4 голосов
/ 05 сентября 2010

Предположим, что у вас была программа на C, которая печатает "обфусцированную" или иным образом косметически модифицированную версию ее источника.Например, предположим, что есть разница в пробелах или именах переменных.

Тогда эта программа не будет квине, поскольку по определению квина - это программа, которая печатает сама себя, и под «собой» мы подразумеваем точно то же самое.последовательность байтов.Но вывод этой программы после компиляции будет печатать то же самое, что и исходная программа (поскольку это всего лишь косметический вариант), т.е.Таким образом, output - это квайн.

Это иногда облегчает процесс написания квин - просто напишите «почти квин», что, возможно, не дает правильного форматирования, запуститеэто один раз, и на выходе получается ваша фактическая квинета.

Это все предполагает, что квин в C .Quine в машинном коде x86 должен будет выводить не его источник C, а ту же последовательность байтов, которая составляет файл .exe.

Я не уверен, что вы подразумеваете под«АКТУАЛЬНЫЙ код», в отличие от «запутанного кода», но чтобы проверить, является ли что-то квин или нет, вам нужно решить, на каком языке он должен быть квин. Возможно, решив, что вы можете ответить на свой вопрос -просто хотите квайн в Си или квин, которая имеет какое-то отношение к вашему обфускатору?

2 голосов
/ 05 сентября 2010

Вот фактическая квинна в стандарте C, найденная в Wikipedia :

main() { char *s="main() { char *s=%c%s%c; printf(s,34,s,34); }"; printf(s,34,s,34); }

Вы заметите, что его структура относительно проста. Он использует строковую константу, содержащую текст программы, как строку формата, так и одно из значений, которые должны быть отформатированы как printf().

При компиляции и запуске он печатает именно эту строку кода.

В вики-статье есть примеры квинов на разных языках, включая еще несколько на языке Си.

0 голосов
/ 06 декабря 2017

Ниже приведен простой код квин.Этот исходный код необходимо сохранить как «quine_file.c».Скомпилируйте и выполните.

Здесь используется простой указатель файла, который используется для построчного чтения исходного файла и его вывода на стандартный вывод.

#include <stdio.h>
#include <stdlib.h>

void main()
{
      FILE *fp = NULL;
      char * line = NULL;
      int len = 0;
      int read;
      fp = fopen("quine_file.c","r");
      if(fp == NULL)
           return;
      while ((read = getline(&line, &len, fp)) != -1) 
      {
           printf("%s", line);
      }
      fclose(fp);
      if (line)
          free(line);
      exit(EXIT_SUCCESS);
}
0 голосов
/ 27 декабря 2012
#include <stdio.h>
main(){
FILE* fp = fopen("printItself.c", "r");
int c;
while ((c = getc(fp)) != EOF)  putc(c, stdout);
}

Сохраните его в файле с именем printItself.c ... Проблема с предыдущим примером заключается в том, что если я добавлю строку в программу, например, int x; мне нужно будет добавить его в строку, также заботясь о новой строке, пробелах и т. д., но в этом примере вы можете добавить все, что захотите.

...