题
Quine是否打印了程序的实际代码IE未混淆或打印混淆程序?
解决方案
我认为混淆与此无关。通常,Quine打印程序本身的实际源代码。
其他提示
假设您有一个C程序,该程序打印了其源的“混淆”或以其他方式修改的版本。例如,假设空格或变量名称存在差异。
然后,该程序不会是Quine,因为从定义上讲,Quine是一个自身打印的程序,而“本身”我们的意思是完全相同的字节顺序。但是 输出 该程序曾经编译后,将打印与原始程序相同的内容(因为它只是一个化妆品变体),即本身。所以 输出 是奎因。
有时,这会简化编写Quine的过程 - 只需写一个“几乎拼写”,它可能无法使格式完全正确,运行一次,并且输出是您的实际Quine。
这都是假设quine的 在c. 。 quine 在X86机器代码中 将不需要输出其C源,而是相同的组成.exe文件的字节序列。
我不确定您所说的“实际代码”而不是“混淆代码”,而是要测试某物是否是quine,您必须确定它应该是什么语言。也许通过确定该语言您可以回答自己的问题 - 您只是想在C中有毒,还是与混淆器有关的Quine?
这是标准C中的实际quine,发现 维基百科:
main() { char *s="main() { char *s=%c%s%c; printf(s,34,s,34); }"; printf(s,34,s,34); }
您会注意到其结构相对简单。它使用包含程序文本的字符串常数作为格式字符串和要格式化的值之一 printf()
.
编译并运行时,它会精确打印那条代码。
Wiki文章中有各种语言中有一些Quines的例子。
以下是一个简单的Quine代码。此源代码需要保存为“ quine_file.c”。编译和执行。
在这里,采用了一个简单的文件指针,并用于通过行读取源文件并将其打印到Stdout。
#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);
}
#include <stdio.h>
main(){
FILE* fp = fopen("printItself.c", "r");
int c;
while ((c = getc(fp)) != EOF) putc(c, stdout);
}
将其保存在名为printitself.c的文件中。我将不得不将其添加到字符串中,同时照顾Newline和Space等...但是在此示例中,您可以添加任何想要的内容。