自我复制代码,如何在第一次迭代中与下面的行为实施不同的行为



所以我在学校项目上度过了艰难的时光。目标是制作自我复制代码,名称Sully.C。该程序必须将其自己的源代码(是Quine)输出到一个名为Sully_x.c的程序中,其中X是源代码中的整数,然后编译上述程序并执行该程序,如果x>0。x必须从一个副本减少到下一个,但不是从原始的sully.c到sully_5.c。

这是我到目前为止的代码:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int k = 5;
#define F1 int main(void){int fd = open("Sully_5.c", 0);if(fd != -1){close(fd);k-=1;}char buff[62];(sprintf)(buff, "Sully_%d.c", k);FILE *f = fopen(buff, "w");fprintf(f, "#include <fcntl.h>n#include <stdio.h>n#include <stdlib.h>n#include <unistd.h>nint k = %d;n#define F1 %sn#define F2(x) #xn#define F3(x) F2(x)nconst char *s = F3(F1);nF1n", k, s);fclose(f);(sprintf)(buff, "gcc -Wall -Wextra -Werror Sully_%d.c -o Sully_%d", k, k);system(buff);if (k != 0){(sprintf)(buff, "./Sully_%d", k);system(buff);}return 0;}
#define F2(x) #x
#define F3(x) F2(x)
const char *s = F3(F1);
F1

该代码有效,并检查程序的所有要求。但是,我正在使用一种检查代码本身以外的其他方法 ->我正在检查Sully_5.c是否已经存在。如果没有,则x不会移动,如果这样做,则将减少。另一种方法是使用argv [0]或宏__FILE__,但是这两个选项都被明确禁止用于作业并考虑作弊。

但是,显然还有其他方法不需要上述任何技术。我什么都不想到,因为如果sully.c和sully_5.c需要不同的行为,但是源代码相同,那么必须有一个需要影响代码行为的外部变量,或者我的假设是这样。

我对吗?错误的?还能怎么做?

...必须有一个外部变量需要影响代码行为

还可以如何完成?

  • 您可以定义或不定义某些预处理变量(例如-Daze-Daze=12等),可以使用条件编译生成不同的代码,而无需更改源

  • 执行还可以使用程序运行时给出的参数来更改其行为

最新更新