小明思考

高性能服务器端计算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Just for fun:能输出自身代码的程序

Posted on 2005-12-02 10:58 小明 阅读(2567) 评论(21)  编辑 收藏 引用 所属分类: C/C++
条件:不借助任何文件操作,输出程序的source code.


程序:
#include <stdio.h>
char c[] = {0x7d,0x3b,0xa,0x69,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x28,0x22,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x73,0x74,0x64,0x69,0x6f,0x2e,0x68,0x3e,0x5c,0x6e,0x63,0x68,0x61,0x72,0x20,0x63,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0x22,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x69,0x3c,0x73,0x69,0x7a,0x65,0x6f,0x66,0x28,0x63,0x29,0x3b,0x2b,0x2b,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x28,0x22,0x30,0x78,0x25,0x78,0x2c,0x22,0x2c,0x63,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x28,0x22,0x25,0x73,0x22,0x2c,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x3b,0xa,0x7d,};
int main()
{
    printf(
"#include <stdio.h>\nchar c[] = {");
    
for(int i=0;i<sizeof(c);++i)
    {
        printf(
"0x%x,",c[i]);
    }
    printf(
"%s",c);
    
return 0;
}

至于怎么做到的,大家可以自己琢磨

不过不要以为只有C能做到,java也可以哦



Feedback

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-02 12:35 by 笨笨
假牙,不具有通用性的输出自身当然好做,
增加 printf("%s",c);
printf("testttttttttttttt");
return 0;
就不行了

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-02 13:33 by Richard Lee
说实话,这个程序比较无聊。

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-02 15:51 by 小明
OK.我承认

这个只是一个智力题,并不是要求通用性

实现还是很巧妙的

# 智力题 :(  回复  更多评论   

2005-12-02 16:42 by fpl
智力题 :(

# 无聊的智力题 :(   回复  更多评论   

2005-12-02 16:44 by fpl
无聊的智力题 :(
实现的有点巧妙

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-02 17:09 by quine
visit http://www.nyx.net/~gthompso/quine.htm for more info about "quine"

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-03 16:18 by 放屁阿狗
这个家伙真是有毛病,把代码转换制数再输出,可以糊弄糊弄c初学者

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-03 18:29 by sa
垃圾,垃圾中的垃圾!怀疑是刚入门的菜鸟

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-03 19:46 by xx
巧妙 但很无聊。
你只输出 了部分原程序, 那数组c呢?

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-03 21:53 by nanami
晕,这种技巧可是说毫无技巧-。-

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-05 13:52 by hehehe
技术为王
要对得起这几个字。。。

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2005-12-07 02:39 by 寒曙
可以,一直想这个问题,总算有个前人解决了!

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2006-01-06 15:38 by flyingleaf
把int main()
{
printf("#include <stdio.h>\nchar c[] = {");
for(int i=0;i<sizeof(c);++i)
{
printf("0x%x,",c[i]);
}
printf("%s",c);
return 0;
}都转化为assic码,然后输出数字一次,输出字符串一次。 有意思。
作为娱乐。

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2006-01-13 15:49 by Terry
Nice quine program!
将数组内容转成ascII 码,避免了使用条件语句 来辨别和输出特殊字符
good job!

# re: by xx   回复  更多评论   

2006-01-18 13:59 by 小软
你只输出 了部分原程序, 那数组c呢?
回答:你只要试一下就能看出数组C是有的,请看:
for(int i=0;i<sizeof(c);++i)
{
printf("0x%x,",c[i]);
}
用于输出数组c.

printf("%s",c);
用于输出主程序本身,数组c中的内容,是
"};
int main()
{
printf("#include <stdio.h>\nchar c[] = {");
for(int i=0;i<sizeof(c);++i)
{
printf("0x%x,",c[i]);
}
printf("%s",c);
return 0;
}"
的编码:(

# 这个叫“输出自身代码”,你也真无聊。  回复  更多评论   

2006-01-25 14:52 by chlf
不过是把C数组里的内容打出来而已。无聊的人

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2006-07-17 15:40 by 我爱ACM
记得好像同济的Online Judge有这一题,完全不知如何入手,现在算解决了……不过个人还是喜欢做一些算法“常规”一点的Online Judge~~呵呵

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2006-10-26 16:07 by 建议
搞技术的希望多贴一点实际有用的文章,解决实际问题为目标。

# re: Just for fun:能输出自身代码的程序[未登录]  回复  更多评论   

2007-08-28 23:02 by 橙子
呵呵。 好神奇。
大哥,说说怎么做的。

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2007-11-02 19:40 by zero
#include <stdio.h>
char*f="#include <stdio.h>%cchar*f=%c%s%c;%cint main(){printf(f,10,34,f,34,10,10);return 0;}%c";
int main(){printf(f,10,34,f,34,10,10);return(0);}

# re: Just for fun:能输出自身代码的程序  回复  更多评论   

2009-03-14 00:06 by 3d彩票
不错啊,呵呵,加油啊

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理