免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 9989 | 回复: 40
打印 上一主题 下一主题

如何让程序打印它自己?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-08 11:51 |只看该作者 |倒序浏览

我还是个学生,请前辈们多指教。
我们这次作业思考题有一道是让我们编个程序
而最后打印出的结果是这个程序它自己!
请问前辈们我应该怎么些这个程序呢?
前提我现在只学了main函数,数组等基本知识
指针什么的都没学到!
老师让我们用现在所学的知识编出来,我不会!
请前辈们指点,谢谢!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2004-10-08 12:06 |只看该作者

如何让程序打印它自己??

老师让我们用现在所学的知识编出来

不用管老师的话,
只要你编出来就行了。
哪怕是用了指针也无妨。

文件操作学了吗?
如果没有学的话,这个题目是没法做的。

另外,老师指定的操作系统是什么?
编程工具是什么?

DOS + TC ?
WINDOWS + VC?
UNIX + GCC?

论坛徽章:
0
3 [报告]
发表于 2004-10-08 13:16 |只看该作者

如何让程序打印它自己??

“程序打印自己”?

倘若是C这种编译型的,那么做“打印”这件事时的“程序”就是可执行文件,已经不是源代码的“自己”了

论坛徽章:
0
4 [报告]
发表于 2004-10-08 13:40 |只看该作者

如何让程序打印它自己??

刚开始学,那你老师的意思很有可能就是用数组保存你的程序了(你赋值字符串给数组,也就是你的程序),要不只有使用文件了

论坛徽章:
0
5 [报告]
发表于 2004-10-08 14:09 |只看该作者

如何让程序打印它自己??

It sonuds like a classical problem and it seems to be too hard for a newbie. Anyway, the codes below meet your requist.


  1. char *p = "\xa\x6d\x61\x69\x6e\x28\x29\xa\x7b\xa\x9\x63\x68\x61\x72\x20\x2a\x71\x20\x3d\x20\x70\x3b\xa\x9\x70\x72\x69\x6e\x74\x66\x20\x28\x22\x63\x68\x61\x72\x20\x2a\x70\x20\x3d\x20\x5c\x22\x22\x29\x3b\xa\x9\x77\x68\x69\x6c\x65\x20\x28\x2a\x70\x29\xa\x9\x9\x70\x72\x69\x6e\x74\x66\x20\x28\x22\x5c\x5c\x78\x25\x78\x22\x2c\x20\x2a\x70\x2b\x2b\x29\x3b\xa\x9\x70\x72\x69\x6e\x74\x66\x20\x28\x22\x5c\x22\x3b\x5c\x6e\x25\x73\x22\x2c\x20\x71\x29\x3b\xa\x7d\xa";

  2. main()
  3. {
  4.         char *q = p;
  5.         printf ("char *p = \"");
  6.         while (*p)
  7.                 printf ("\\x%x", *p++);
  8.         printf ("\";\n%s", q);
  9. }
复制代码


./a.out | diff - foo.c

论坛徽章:
0
6 [报告]
发表于 2004-10-08 16:50 |只看该作者

如何让程序打印它自己??

楼上的, 这个程序实在是经典

是不是可以解释一下?

论坛徽章:
0
7 [报告]
发表于 2004-10-08 16:59 |只看该作者

如何让程序打印它自己??

  1. "\xa\x6d\x61\x69\x6e\x28\x29\xa\x7b\xa\x9\x63\x68\x61\x72\x20\x2a\x71\x20\x3d\x20\x70\x3b\xa\x9\x70\x72\x69\x6e\x74\x66\x20\x28\x22\x63\x68\x61\x72\x20\x2a\x70\x20\x3d\x20\x5c\x22\x22\x29\x3b\xa\x9\x77\x68\x69\x6c\x65\x20\x28\x2a\x70\x29\xa\x9\x9\x70\x72\x69\x6e\x74\x66\x20\x28\x22\x5c\x5c\x78\x25\x78\x22\x2c\x20\x2a\x70\x2b\x2b\x29\x3b\xa\x9\x70\x72\x69\x6e\x74\x66\x20\x28\x22\x5c\x22\x3b\x5c\x6e\x25\x73\x22\x2c\x20\x71\x29\x3b\xa\x7d\xa";
复制代码


刚测试了一下,以上的代码就是涵数体的变形用十六进制的形式表现出来!

其实就是打印两遍,一遍打印自身,一遍打印涵数体

不错不错,高,实在是高!

论坛徽章:
0
8 [报告]
发表于 2004-10-08 17:01 |只看该作者

如何让程序打印它自己??

那还可以把它转化而以\000开头的用八进制表示

论坛徽章:
0
9 [报告]
发表于 2004-10-08 17:06 |只看该作者

如何让程序打印它自己??

还有没有更好的方法?

上面的代码好像还要事先把源代码转化成字符串

有没有办法自动生成啊??

论坛徽章:
0
10 [报告]
发表于 2004-10-08 17:18 |只看该作者

如何让程序打印它自己??

俺记得前一阵俺也写过一个,再贴一次吧。
  1. #include <stdio.h>;

  2. int main()
  3. {
  4.    FILE *f;
  5.    char c;

  6.    if ( ( f = fopen( __FILE__, "r" ) ) != NULL ) {
  7.       while ( fread( &c, 1, 1, f ) == 1 )
  8.           frwite( &c, 1, 1, stdout );
  9.       fclose( f );
  10.    }
  11.    return 0;
  12. }
复制代码

这个实现要求文件操作的知识,而win_hate兄的则不需要;但是这个程序可在任何字符集的机器上得到正常结果,而win_hate兄的只能在ASCII字符集的机器上得到正常结果。当然把win_hate兄的实现稍做改动也是可以达到同样目的的,但那样就没有现在这样的悬念了,呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP