Так что мне тяжело со школьным проектом.Цель состоит в том, чтобы создать самовоспроизводящийся код с именем Sully.c.Эта программа должна вывести свой собственный исходный код (это квинну) в программу с именем 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 или нет.Если это не так, х не двигается, если он делает, то это уменьшается.Другим методом было бы использовать argv [0] или макрос __FILE__
, но обе эти опции явно запрещены для назначения и считались обманом.
Но, очевидно, есть другие методы, которые не требуютлюбой из вышеперечисленных методов.Я не могу думать ни о чем, потому что, если Sully.c и Sully_5.c требуют различного поведения, но одного и того же исходного кода, тогда должна существовать внешняя переменная, которая должна влиять на поведение кода, или моя гипотеза такова.
Я прав?Неправильно?Как еще это можно сделать?