刚看了北大刘田老师讲的递归定理,忍不住好奇心,用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;}
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算