自我复制机(C语言实现版)

刚看了北大刘田老师讲的递归定理,忍不住好奇心,用C语言实现了他讲的自我复制机。

其中为了模拟图灵机的可改变的输入带,我用了sprintf函数,使用字符数组input来暂时保存带上的内容,方便改变。

这里,转义字符是一个大坑,所以我用deal字符数组,来解决转义字符的问题。实际上input和deal数组里存储的内容是相同的,只是由于转义字符,两者要进行一个转换,具体见transfer函数。

最终打印出来的,即C源码自身。

#include<stdio.h>
char input[100000];
char deal[100000];
void transfer(){int i=0,pos=0;while(input[i]!=0){if(input[i]=='\n'){deal[pos++]='\\';deal[pos++]='n';}else if(input[i]=='\"'){deal[pos++]='\\';deal[pos++]='\"';}else if(input[i]=='\\'){deal[pos++]='\\';deal[pos++]='\\';}else if(input[i]=='%'){deal[pos++]='%';deal[pos++]='%';}else{deal[pos++]=input[i];}i++;}}
void a(){sprintf(input,"int main(){printf(\"#include<stdio.h>\\nchar input[100000];\\nchar deal[100000];\\nvoid transfer(){int i=0,pos=0;while(input[i]!=0){if(input[i]=='\\\\n'){deal[pos++]='\\\\\\\\';deal[pos++]='n';}else if(input[i]=='\\\\\\\"'){deal[pos++]='\\\\\\\\';deal[pos++]='\\\\\\\"';}else if(input[i]=='\\\\\\\\'){deal[pos++]='\\\\\\\\';deal[pos++]='\\\\\\\\';}else if(input[i]=='%%%%'){deal[pos++]='%%%%';deal[pos++]='%%%%';}else{deal[pos++]=input[i];}i++;}}\\n\");a();transfer();printf(\"void a(){sprintf(input,\\\"%%s\\\");}\\n\",deal);printf(\"%%s\",input);return 0;}");}
int main(){printf("#include<stdio.h>\nchar input[100000];\nchar deal[100000];\nvoid transfer(){int i=0,pos=0;while(input[i]!=0){if(input[i]=='\\n'){deal[pos++]='\\\\';deal[pos++]='n';}else if(input[i]=='\\\"'){deal[pos++]='\\\\';deal[pos++]='\\\"';}else if(input[i]=='\\\\'){deal[pos++]='\\\\';deal[pos++]='\\\\';}else if(input[i]=='%%'){deal[pos++]='%%';deal[pos++]='%%';}else{deal[pos++]=input[i];}i++;}}\n");a();transfer();printf("void a(){sprintf(input,\"%s\");}\n",deal);printf("%s",input);return 0;}
发布了4 篇原创文章 · 获赞 0 · 访问量 210

猜你喜欢

转载自blog.csdn.net/qq_42378281/article/details/105513860