ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-04-15 18:37:12  阅读:314  来源: 互联网

标签:deal ++ transfer pos 自我 else 复制 input 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;}

标签:deal,++,transfer,pos,自我,else,复制,input,C语言
来源: https://blog.csdn.net/qq_42378281/article/details/105513860

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有