写一段程序,程序运行的结果就是源代码本身的内容

    From: xuyibo.org  Date: 2021-03-20 03:01 PM


    在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); }


    思路三:输出自己源文件(此思路应不能算解决方案,这种程序只能在DEBUG RUN环境下跑的通而已,正常运行环境根本没源码在)

    C++ CODE:
    #include
    #include
    using namespace std;
    int main()
    {
    ifstream ifs(__FILE__);
    cout << ifs.rdbuf();
    ifs.close();
    }


    思路四:当真自己输出自己源码,如果用这种思路,那基本上只能用ASM写了,下面程序只输出了自己代码的机器码,但是转出汇编是可行的,譬如DEBUG的G命令就是此功能,只不过要自己写。

    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 '$ '


    思路五:下面的思路就属于精华部分了,虽然没有技术含量,但是思维开阔程度令人惊讶。

    1.批处理文件:应该算是最短的了,如果这个能叫源代码的话,-_-#
    echo on
    2.下面这个思路让我敬仰得如黄河之水滔滔不绝:
    用记事本写如下内容:“C:\Documents and Settings\new\桌面\新建 文本文档.exe 不是有效的Win32应用程序。”,在桌面保存成“新建 文本文档.exe”文件,双击该文件打开,显示同上。

    https://www.fenixsoft.net/blogview.asp?logID=103&cateID;=1

    User:

Built on: 2021-5-14 0:13:02
Copyright © 2006-2008 xuyibo.org All rights reserved.
网站地图