c - self 复制代码,如何在第一次迭代和后续迭代中实现不同的行为?

标签 c

所以我在学校项目上遇到了困难。目标是制作一个 self 复制的代码,命名为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 %s\n#define F2(x) #x\n#define F3(x) F2(x)\nconst char *s = F3(F1);\nF1\n", 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 需要不同的行为但相同的源代码,那么一定有一个外部变量需要影响代码行为,或者我的假设也是如此。

我说得对吗?错误的?还有什么办法可以做到这一点?

最佳答案

... there must be an external variable that needs to influence the code behavior

How else could this be done?

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

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

关于c - self 复制代码,如何在第一次迭代和后续迭代中实现不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54961676/

相关文章:

c - 访问不带参数的函数变量值

c - 编写函数原型(prototype)的明智方法

c - WinAPI 写文件

c - 使用套接字时如何获得下载速度?

C - 访问二维数组槽函数不起作用,崩溃

ios - 如何用Xcode从苹果源代码编译CoreFoundation?

c - 如果语句没有被捕获

c - Objective-C运行时如何实例化根元类和其他类描述?

c - 求给定字符串中数字的总和

c - gcc 的 __attribute__((packed))/#pragma pack 不安全吗?