Quine Confusion.Quine打印什么?

时间:2010-09-05 07:40:01

标签: c quine

是否打印出程序的ACTUAL代码,即没有混淆或是否打印出混淆程序?

6 个答案:

答案 0 :(得分:7)

我不认为混淆与它有任何关系。通常,quine打印程序本身的实际源代码。

答案 1 :(得分:4)

假设您有一个C程序,它打印出“混淆”或其他美容修改版本的源代码。例如,假设空格或变量名称存在差异。

然后该程序不会是一个quine,因为根据定义,quine是一个打印自身的程序,而“本身”我们指的是完全相同的字节序列。但是,该程序的输出,一旦编译,将打印与原始程序相同的东西(因为它只是一个整容变体),即它本身。所以输出是一个quine。

这有时可以简化编写quine的过程 - 只需写一个“近似”,这可能不会使格式正确,运行一次,输出就是你的实际值。

这都是假设C 中的quine 。 x86机器代码中的quine 必须输出不是它的C源,而是输出组成.exe文件的相同字节序列。

我不确定你的“ACTUAL代码”是什么意思而不是“混淆代码”,但是为了测试某些东西是否是一个quine,你必须决定它应该是什么语言的quine。也许通过决定你可以回答你自己的问题 - 你只想要一个C中的quine,或者一个与你的混淆器有关的quine?

答案 2 :(得分:2)

这是标准C中的实际quine,位于Wikipedia

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

您会注意到它的结构相对简单。它使用包含程序文本的字符串常量作为格式字符串和由printf()格式化的值之一。

编译并运行时,它会精确打印该单行代码。

在维基文章中,有各种语言的quines例子,包括C语言中的几个。

答案 3 :(得分:0)

以下是一个简单的quine代码。此源代码需要保存为“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);
}

答案 4 :(得分:0)

quine是一个打印自己的列表的程序。这意味着程序运行时,必须精确打印出程序员作为程序一部分编写的那些指令(当然包括进行打印的指令以及打印中使用的数据)。

-David Madore

Further reading

JavaScript示例

$=_=>`$=${$};$()`;$();

执行该程序时,它将在控制台中显示以下字符串

"$=_=>`$=${$};$()`;$();"

代码video的艺术特色@ 30m21s -迪伦·比蒂

答案 5 :(得分:-1)

#include <stdio.h>
main(){
FILE* fp = fopen("printItself.c", "r");
int c;
while ((c = getc(fp)) != EOF)  putc(c, stdout);
}

将其保存在名为printItself.c的文件中...以前的示例问题是如果我在程序中添加一行,例如int x;我将不得不在字符串中添加它同时处理换行符和空格等...但在这个例子中你可以添加你想要的任何东西。