徐艺波个人网站 | Make everything as simple as possible, but not simpler. Albert Einstein | ||
在CSDN看到的一个帖子:要求写一段程序,程序运行的结果就是源代码本身的内容。
第一个反应就是这不可能,存在这样的逻辑矛盾:程序不编译就不能运行,编译了就不可能还原回原来的代码。所以运行输出源代码不可行。
但是看了后面大家的讨论,不得不佩服一下,果然是程序员的论坛,没有做不到,只有想不到,总结几个思路如下:
思路一:定义字符串就跟外部代码一样,将字符串输出两次来构造会原来的代码:
C/C++ CODE:
#include
char *a='#include%c%cchar *a=%c%s%c;%c%cint main(){printf(a,13,10,34,a,34,13,10); return 0;}';
int main(){printf(a,13,10,34,a,34,13,10); return 0;}
Java CODE:
class S{public static void main(String[]a){String s='class S{public static void main(String[]a){String s=;char c=34;System.out.println(s.substring(0,52)+c+s+c+s.substring(52));}}';char c=34;System.out.println(s.substring(0,52)+c+s+c+s.substring(52));}}
JavaScript CODE:
function test() { document.write(test); }
C++ CODE:
#include
#include
using namespace std;
int main()
{
ifstream ifs(__FILE__);
cout << ifs.rdbuf();
ifs.close();
}
Assembly code:
13A8:0100 call 103
13A8:0103 pop dx
13A8:0104 sub dx,3
13A8:0107 push cs
13A8:0108 pop ds
13A8:0109 mov ax,0900
13A8:010C int 21
13A8:010E int 3
13A8:010F db '$ '