比如:main(){char q=34,n=10,*a="main(){char q=34,n=10,*a=%c%s%c;printf(a,q,a,q,n);}%c";printf(a,q,a,q,n);}程序运行后正好输出自己,一字不差。有一个网站专门收集这类代码-》传送门
历史发起的帖子(C#)传送门要求:
1、htm文件;
2、浏览器中输出源文件一样,包括大小写、标点符号;
3、兼容IE6+、FF、Chrome。奖励:
1、第一个完成,加20分;
2、源文件最短,加100分;
3、之前没有使用过的方法,加10分下周一结贴给分。模板:<script>/* todo */</script>谢谢关注。

解决方案 »

  1.   


    <script>
    var httpRequest=function(){
    var xmlHttp=false;
    try{
    xmlHttp = new XMLHttpRequest();
    }
    catch(trymicrosoft){
    try{
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(othermicrosoft){
    try{xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")}
    catch(failed){}
    }
    }
       return xmlHttp;
    };
    var ajaxGet=function(url,functionCallback){
    var xmlHttp = httpRequest();
    xmlHttp.open("get",url,true);
    xmlHttp.onreadystatechange = function(){
    if(xmlHttp.readyState == 4&&xmlHttp.status == 200){
    functionCallback(xmlHttp);
    }
    };
    xmlHttp.send(null);
    };
    window.onload=function(){
    ajaxGet(window.location.href,
    function(xmlHttp){
    var str=xmlHttp.responseText;
    var reg=new RegExp("<([^>]+)>","img");
    str=str.replace(reg,"&lt;$1&gt;");
    document.body.innerHTML=str;
    }
    );
    };
    </script>试试
      

  2.   

    回车符没替换成<br/>所以输出可能乱点,如果要输出整齐window.onload=function(){
    ajaxGet(window.location.href,
    function(xmlHttp){
    var str=xmlHttp.responseText;
    var reg=new RegExp("<([^>]+)>","img");
    str=str.replace(reg,"&lt;$1&gt;");
    str=str.replace(new RegExp("\n","img"),"<br/>");
    document.body.innerHTML=str;
    }
    );
    };
      

  3.   

    感谢参与!问题:输出没有考虑空格和换行;和源文件还是有差别。另外:运行需要放在站点上;
    算是一种方法吧 -- 通过http get。
      

  4.   

    http get,比较短的写法:
    <script>var q=XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");q.open("GET",location.href,false);q.send();document.write(q.responseText.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"))</script>
      

  5.   

    zswang你的代码运行不通过,哇哈哈!
    没有考虑页面加载的问题
      

  6.   


    用各种浏览器打开试试吧:http://www.renrousousuo.com/tools/printself.html哥帖代码99%都是经过测试的。
      

  7.   

    我用IE 6.0,报脚本错误...错误: 'XMLHttpRequest' 未定义
      

  8.   

    囧 果然var q=XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
    ->
    var q=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
      

  9.   

    var q=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
      

  10.   

    我来一个
    function encode(v){return v.replace(/</g,'&lt;');}
    window.onload=function(){
      var pre=document.createElement('pre');
      pre.innerHTML=typeof(HTMLElement) != "undefined"?
          encode(document.createElement("DIV").appendChild(document.documentElement.cloneNode(true)).parentNode.innerHTML):encode(document.documentElement.outerHTML);
      document.body.appendChild(pre);
    }
      

  11.   


    <script type="text/javascript">
    window.onload=function()
    {
    var arrcontrol=document.getElementsByTagName("script")[0];
    document.write(arrcontrol.parentNode.innerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;"))
    };
    </script>
      

  12.   


    这个没有考虑HTML TAG在ie下大写的问题innerHTML..
      

  13.   

    还有 代码中的&lt等显示出来之后有区别
      

  14.   

    借楼上的构思。<script language="javascript">var a=[];a[0]='script',a[1]='&lt;',a[2]='&gt;';document.write(document.getElementsByTagName('script')[0].parentNode.innerHTML.replace(/(script|SCRIPT)/g,a[0]).replace(/&/g,'&amp;').replace(/</g,a[1]).replace(/>/g,a[2]));</script>
      

  15.   

    利用innerHTML也算一种方法
    16楼实现得比较接近
    <script>a=['script','&lt;','&gt;'];d=document;d.write(d.getElementsByTagName('script')[0].parentNode.innerHTML.replace(/script/ig,a[0]).replace(/&/g,'&amp;').replace(/</g,a[1]).replace(/>/g,a[2]));</script>
    可以稍作简化
      

  16.   

    没有考虑换行放一个连接:
    http://www.renrousousuo.com/tools/printself.html
      

  17.   


    (s = function () { var a = this; (function (b) {document.write('(' + b.s + ')()')})(a); })()
      

  18.   

    改了一下,刚没想清this的指向。
    (s = function () { (function (b) {document.write('(' + b.s + ')()')})(window); })()
      

  19.   

    刚上面两个都有问题,这个是最终版,有错也不改了!,能再短也不改了。
    (s = function(){document.write('(s = ' + window.s + ')()')})()
      

  20.   

    本帖最后由 zswang 于 2010-05-30 00:11:36 编辑
      

  21.   

    本帖最后由 zswang 于 2010-06-04 23:18:38 编辑
      

  22.   


    这么土方法没有人用吧.....
    加10分
    加10分
    oh,yeah!window.onload=function(){
       var a = [];
       var g = document.documentElement.innerHTML;
       a = g.split("<");
       var text ="&lt;html>";
       for(var i=1;i<a.length;i++){
           text+="&lt;"+a[i];
       }
       document.write(text+"&lt;/html>");
    }
      

  23.   

    依然用innerHTML取内容,用一个别的编码方法,
    d = document;str=d.getElementsByTagName('script')[0].parentNode.innerHTML;t = d.createElement("div");
    (t.textContent != undefined) ? (t.textContent = str) : (t.innerText = str);
    d.write(t.innerHTML);
      

  24.   

    重发一下,忘写外边标签了。<script language="javascript" >
    d = document;str=d.getElementsByTagName('script')[0].parentNode.innerHTML;t = d.createElement("div");
    (t.textContent != undefined) ? (t.textContent = str) : (t.innerText = str);
    d.write(t.innerHTML);//(s = function(){document.write('(s = ' + window.s + ')()')})()
    </script>
      

  25.   

    我也来一个,主要是接分。
    <script>document.write("&lt;script&gt;"+document.scripts[0].innerHTML.replace(/&/ig,"&amp;")+"&lt;/script&gt;")</script>
      

  26.   

    这样? ^_^
    <script>
    +function(){
    var r = /(<script>)([\s\S]*?)(<\/script>)/i;
    var s = document.documentElement.innerHTML.match(r)[0];
    var ret = s.replace(r,function(a,b,c,d){return b.toLowerCase()+c+d.toLowerCase()});
    alert(ret);
    }();
    </script>
      

  27.   

    <script  type="text/javascript" id="my">
    (function(){alert(document.getElementById("my").innerHTML)})();
    </script>
      

  28.   

    我也来一个吧.....<script type="text/javascript">
    //我也来一个吧。^_^
    (function(){
        var obj = document.getElementsByTagName("script");
        document.write(obj[obj.length-1].parentNode.innerHTML.replace(/<([^>]+)>/g, "&lt;$1&gt;").replace(/\n/g,"<br/>").toLowerCase())//你看我输出自己输出自己——
    })();
    </script>
      

  29.   

    以上兼容:IE 8.0.6、FF 3.6.4:90ms、Chrome 6.0.422、Safari 4.0.5、Opera 10.60。
      

  30.   

    纠正:<script type="text/javascript">
    //我也来一个吧。^_^
    (function(){
        var obj = document.getElementsByTagName("script");
        document.write(obj[obj.length-1].parentNode.innerHTML.replace(/<([^>]+)>/g, function($1,$2){return "&lt;"+$2.toLowerCase()+"&gt;"}).replace(/\n/g,"<br/>"))//我输出自己输出自己——
    })();
    </script>
      

  31.   

    发表不成,说有“非法字符”。只好去我的Blog里看了。
    http://blog.csdn.net/KiteGirl/archive/2010/06/07/5652091.aspx
      

  32.   

    悲喜田枯井lsfj;lsjdflkdfl  
      

  33.   

    <script id='a'>document.write(document.getElementById('a').innerHTML)</script>
    (s=function () { document.write("(s=" + s + ")()"); })()
      

  34.   

    <script>(s=function () { document.write("&lt;script>(s=" + s.toString().replace(/&/g, "&amp;") + ")()&lt/script>"); })()</script>