quine 打印程序的实际代码(即未混淆)还是打印混淆程序?
6 回答
我不认为混淆与它有任何关系。通常,quine 会打印程序本身的实际源代码。
假设您有一个 C 程序,它打印其源代码的“混淆”或其他修饰版本。例如,假设空格或变量名称有所不同。
那么那个程序就不是一个 quine,因为根据定义,一个 quine 是一个打印自身的程序,而“自身”是指完全相同的字节序列。但是该程序的输出,一旦编译,将打印与原始程序相同的内容(因为它只是一个装饰变体),即它本身。所以输出是一个quine。
这有时会简化编写 quine 的过程 - 只需编写“nearly-quine”,它可能无法完全正确地格式化,运行一次,输出就是您的实际 quine。
这一切都假设C 中有一个 quine 。x86 机器代码中的 quine必须输出的不是其 C 源代码,而是构成 .exe 文件的相同字节序列。
我不确定您所说的“实际代码”是什么意思,而不是“混淆代码”,但是要测试某物是否是 quine,您必须决定它应该是哪种语言。也许通过决定你可以回答你自己的问题——你只是想要一个 C 中的 quine,还是一个与你的混淆器有关的 quine?
这是标准 C 中的实际 quine,可在Wikipedia上找到:
main() { char *s="main() { char *s=%c%s%c; printf(s,34,s,34); }"; printf(s,34,s,34); }
您会注意到它的结构相对简单。它使用包含程序文本的字符串常量作为格式字符串和要格式化的值之一printf()
。
编译并运行时,它会准确打印那一行代码。
wiki 文章中有多种语言的 quines 示例,包括 C 语言中的更多示例。
以下是一个简单的 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);
}
#include <stdio.h>
main(){
FILE* fp = fopen("printItself.c", "r");
int c;
while ((c = getc(fp)) != EOF) putc(c, stdout);
}
将它保存在一个名为 printItself.c 的文件中......前面例子的问题是,如果我在程序中添加一行,例如 int x; 我还必须在处理换行符和空格等的同时将其添加到字符串中……但是在此示例中,您可以添加任何您想要的内容。