一道笔试题,高手请帮忙
试题1)
用C语言编写一个程序,能够将程序自身显示出来。(程序越短越好)
即: 由源程序编译连接生成可执行文件,在源程序已删除的情况下,运行可执行文件,能将源程序的内容显示出来。
如: 源程序aaa.c,编译连接生成aaa.exe,然后删除源程序aaa.c,再运行aaa.exe,则在屏幕上显示源程序aaa.c的全部内容,一模一样,包括回车、换行等。
注: 要求在没有源程序的情况下,运行可执行文件,能够显示原来源程序的内容。因为没有源程序,可执行文件就无法再读取源程序,另外也不需可执行文件来删除源程序。
(不能使用文件操作来读取源程序)
问题点数:0、回复次数:40Top
1 楼liujingfu123(Oh_My_GoD)回复于 2005-06-03 08:18:19 得分 0
MARK!Top
2 楼foochow(无聊,灌水......)回复于 2005-06-03 08:19:25 得分 0
mark!!Top
3 楼mefit(何足道)回复于 2005-06-03 08:24:26 得分 0
这个好像在c专家编程有个类似的例子吧Top
4 楼clear117(小风)回复于 2005-06-03 10:05:32 得分 0
mark!!!Top
5 楼barbara2008(亦农)回复于 2005-06-03 11:12:39 得分 0
#include <iostream.h>
#include <fstream.h>
int main()
{
char ch;
ifstream fileA(__FILE__);
if (fileA)
{
ofstream fileB("bak.dat");
while (fileA.get(ch)) fileB << ch;
}
ifstream fileC("bak.dat");
if (fileC) while (fileC.get(ch)) cout << ch;
return 0;
}Top
6 楼cmoring(my study will go on)回复于 2005-06-03 11:13:38 得分 0
根据exe读出.c 程序,估计不大可能,反编译也未必能完全成,何况把汇编代码“翻译”成.c代码 复杂!一个简单算法在汇编就是很多代码的。我个人的简单理解,欢迎大家批评指点。Top
7 楼whatsouta(某疯子)回复于 2005-06-03 11:31:56 得分 0
好高深Top
8 楼magicsnake(北极狐)回复于 2005-06-03 11:39:08 得分 0
标志一下,看看高手们怎么做Top
9 楼wfwater(淡水)回复于 2005-06-03 11:43:16 得分 0
实在想不通,希望能看到高手精彩的解答。Top
10 楼tian_su(问天(渺小得惶恐))回复于 2005-06-03 11:58:43 得分 0
UPTop
11 楼QunKangLi(心里面疼得有点发酸 一定是有雾来了 打湿了我的眼眶)回复于 2005-06-03 12:05:04 得分 0
#include <stdio.h>
int main() { const char *p; return printf( p, 10, 34, p = "#include <stdio.h>%cint main() { const char *p; return printf( p, 10, 34, p = %c%s%c, 34 ) ; } ", 34 ) ; }
Top
12 楼QunKangLi(心里面疼得有点发酸 一定是有雾来了 打湿了我的眼眶)回复于 2005-06-03 12:07:30 得分 0
VC6中测试的,如果按纯C标准,需要删除两个const单词。Top
13 楼QunKangLi(心里面疼得有点发酸 一定是有雾来了 打湿了我的眼眶)回复于 2005-06-03 12:08:24 得分 0
10是ASCII字符'\n',34是ASCII字符'\"'Top
14 楼tian_su(问天(渺小得惶恐))回复于 2005-06-03 12:17:10 得分 0
强Top
15 楼Cuiql(向前冲,向后看)回复于 2005-06-03 12:48:14 得分 0
学习Top
16 楼bidongliang_2000()回复于 2005-06-03 13:54:19 得分 0
厉害啊,可是俺不会用这么复杂的printf函数,所以写出来胖了好多
换行的问题只要在里面加上'\n'就行了,和'\'和处理方法一样
#include<iostream>
#include<string>
using namespace std;
void main(){
string self("#include<iostream> #include<string> using namespace std; void main(){string self(; string a(\");string b(\");string c(});self.insert(81,self);self.insert(81,a);self.erase(163,1);self.insert(174,b);self.insert(187,b);self.insert(347,));self.insert(347,a);self.insert(362,a);self.insert(362,b);self.insert(363,a);self.insert(376,b);self.insert(376,b);self.insert(376,a);self.insert(391,a);self.insert(393,a);cout<<self;}");
string a("\"");
string b("\\");
string c("}");
self.insert(81,a);
self.insert(82,self);
self.erase(163,1);
self.insert(174,b);
self.insert(187,b);
self.insert(347,")");
self.insert(347,a);
self.insert(362,a);
self.insert(362,b);
self.insert(363,a);
self.insert(376,b);
self.insert(376,b);
self.insert(376,a);
self.insert(391,a);
self.insert(393,a);
cout<<self;
}Top
17 楼mostideal(三甲)回复于 2005-06-03 15:25:44 得分 0
mark!!!Top
18 楼diterlish(Sesshoumaru)回复于 2005-06-03 16:32:50 得分 0
学习Top
19 楼jingyueid(干宁)回复于 2005-06-03 18:34:11 得分 0
#include <stdio.h>
int main() { const char *p; return printf( p, 10, 34, p = "#include <stdio.h>%cint main() { const char *p; return printf( p, 10, 34, p = %c%s%c, 34 ) ; } ", 34 ) ; }
-------------------------------
好漂亮的代码。
Top
20 楼hanxingwuqing(无效参数)回复于 2005-06-03 20:03:38 得分 0
回复人: QunKangLi(To iterate is human,to recurse divine) ( ) 信誉:100 2005-06-03 12:05:00 得分: 0
#include <stdio.h>
int main() { const char *p; return printf( p, 10, 34, p = "#include <stdio.h>%cint main() { const char *p; return printf( p, 10, 34, p = %c%s%c, 34 ) ; } ", 34 ) ; }
对于此人,此代码,俺只能说两个字~~~~~~~~~~~~~~~~~~~~~崇拜!!!!!!!!!!!!!!Top
21 楼pippen2333(学习是为了赚钱)回复于 2005-06-03 20:03:58 得分 0
学习,mark啥意思啊?Top
22 楼minrr(平平淡淡)回复于 2005-06-03 20:32:38 得分 0
先抄下来!Top
23 楼skingsky(菜鸟的烦恼)回复于 2005-06-03 21:23:41 得分 0
我敢肯定地说在CSDN上还没有人能编出这个程序来!
这个程序是由一个得图灵奖的计算机大师编出来的!
图灵奖大家知道吧!计算机最高荣誉奖。Top
24 楼blueice718(冰蓝)回复于 2005-06-03 21:38:18 得分 0
文件操作不会,学习~~~Top
25 楼cao12m(★草上飞★)回复于 2005-06-03 21:42:29 得分 0
给你说一个不可行的办法
在计算机上装TC 和VC++二中编译器 用TC写写完后就自动在VC++中生成代码 这就是BAR技术呵呵Top
26 楼NetsEagle(指针)回复于 2005-06-03 22:04:07 得分 0
又是这个题,翻翻老帖子,都好几遍了Top
27 楼zzm7000()回复于 2005-06-03 22:44:00 得分 0
barbara2008(亦农) QunKangLi(To iterate is human,to recurse divine) 的方法都是搞笑作弊法Top
28 楼SuperZXTMaster(扬帆)回复于 2005-06-03 23:44:14 得分 0
#include <iostream>
using namespace std;
int main()
{
cout<<"#include <iostream>\nusing namespace std;\nint main()\n{\ncout<<\"#include <iostream>\nusing namespace std;\nint main()\n{\nreturn 0;\n}\";\nreturn 0;\n}";
return 0;
}Top
29 楼SuperZXTMaster(扬帆)回复于 2005-06-03 23:45:54 得分 0
总是感觉这样的题目很没有意思.
也体现不出什么好的编程思想和功底Top
30 楼zx_name({电冷心})回复于 2005-06-04 17:39:46 得分 0
有人把哪个得图灵奖的人的实现帖一下吗?
学习一下Top
31 楼xuxingren(xuxingren)回复于 2005-06-07 06:18:58 得分 0
有这样的提示,要求编写出完整的程序,这里有一个例程可供参考,但是还不完善,显示内容和源程序还 不一模一样,可以在这个基础上做完成。
例程:
main(){char*s="main(){char*s=\"%s\";printf(s,s);}";printf(s,s);}
Top
32 楼xuxingren(xuxingren)回复于 2005-06-07 06:19:09 得分 0
有这样的提示,要求编写出完整的程序,这里有一个例程可供参考,但是还不完善,显示内容和源程序还 不一模一样,可以在这个基础上做完成。
例程:
main(){char*s="main(){char*s=\"%s\";printf(s,s);}";printf(s,s);}
Top
33 楼zhouhuaikun(怀空)回复于 2005-06-07 08:18:29 得分 0
markTop
34 楼mccxj(老鼠不逛街)回复于 2005-06-07 08:35:55 得分 0
#include <stdio.h>
int main() { const char *p; return printf( p, 10, 34, p = "#include <stdio.h>%cint main() { const char *p; return printf( p, 10, 34, p = %c%s%c, 34 ) ; } ", 34 ) ; }
----------------------------------------------------------------------------
汗。。此等强人。。。。pf。。Top
35 楼xnlcx(J2EE.Net)回复于 2005-06-07 08:46:21 得分 0
顶一下
Top
36 楼James_ht(顺风飞扬)回复于 2005-06-07 09:27:36 得分 0
强。学习。Top
37 楼cqpp()回复于 2005-06-07 14:37:28 得分 0
#define print_macro(x) x\
printf("print_macro(%s);\n", #x );
print_macro(
int i;
int j;
int c;
i = 0;
j = 0;
c = 0;
...... )Top
38 楼lalalalala(van)回复于 2005-06-07 15:49:14 得分 0
真的是笔试题吗?看来大家以后去笔试都要把这个程序被下来了Top
39 楼flysky_yzu(天中天(学海无涯))回复于 2005-06-07 16:59:51 得分 0
MARKTop
40 楼manya2005(mydio)回复于 2005-06-07 17:40:52 得分 0
学习ING~~~Top




