回 帖 发 新 帖 刷新版面

主题:[原创]发个有趣的程序

运行后注意看输出结果和源代码

#include<stdio.h>
main()
{
    char s1[]=";|    char s2[]=~#include<stdio.h>$main()${$    char s1[]=~;|    char *p;|    for(p=s2;*p;p++)if(*p=='$')*p=10;|    printf(s2);putchar(34);printf(s1);putchar(34);|    for(p=s1;*p;p++)|    {|        if(*p==124)*p=10;|        if(*p==126)*p=34;|    }|    printf(s1);|}| ";
    char s2[]="#include<stdio.h>$main()${$    char s1[]=";
    char *p;
    for(p=s2;*p;p++)if(*p=='$')*p=10;
    printf(s2);putchar(34);printf(s1);putchar(34);
    for(p=s1;*p;p++)
    {
        if(*p==124)*p=10;
        if(*p==126)*p=34;
    }
    printf(s1);
}

回复列表 (共12个回复)

沙发

有什么用呢???

板凳

看不出来吗?这是个打印自身的程序

3 楼

在程序中储存自身的源代码 也许并不很高明吧

4 楼

呵呵,想从源代码文件中读出来吗?这当然是最简单的方法,但是就没什么挑战了
这是计算理论中的打印自身问题;认为很简单的话可以自己试试

5 楼

干脆我再给个解释吧:直接printf是不可能实现的
证明:
如果程序A打印程序B
A源代码:
main()
{
printf("....(B源代码)");
}
这时A要比B复杂,因为A不仅包含了B的全部代码,还有main(),printf等代码。
代码长度也是A>B。
如果A要打印A呢?A比自身还复杂?A的代码比自身的代码还长?
[em1]

6 楼

楼上大哥说的好,楼主的程序并不高明!!

7 楼

比较有趣,请教思路!!

8 楼

char*s="char*s=%c%s%c;main(){printf();}";
    main(){printf(s,34,s,34);}

这才叫打印程序自身代码

9 楼

顶~~~~~

10 楼

楼主处理得不错,两个难点都解决了。^_^
8楼的程序是不对的。^_^
下面是本论坛对这个问题的讨论部分贴子。
http://www.programfan.com/club/showbbs.asp?id=67332
http://www.programfan.com/club/showbbs.asp?id=59867

这个“游戏”还有更精彩的玩法

试试这个程序

#include "stdafx.h"
#include "stdio.h"
/* -----------------------dhyang.c------------------------- */
  #define/**/X
char*d="X0[!4cM,!"
   "4cK`*!4cJc(!4cHg&!4c$j"
  "8f'!&~]9e)!'|:d+!)rAc-!*m*"
 ":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!"
"+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c"
")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+"
"d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)"
"d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E"
   "!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)"
   "f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b"
   "+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4"
   "!2)c9e2!9b;e1!8b>e/!   7cAd-!5fAe+!7fBe(!"
   "8hBd&!:iAd$![7S,Q0!1   bF 7!1b?'_6!1c,8b4"
   "!2b*a,*d3!2n4f2!${4  f.   '!%y4e5!&f%"
  "d-^-d7!4c+b)d9!4c-a  'd    :!/i('`&d"
  ";!+l'a+d<!)l*b(d=!'  m-    a &d>!&d'"
  "`0_&c?!$dAc@!$cBc@!$  b     <  ^&d$`"
  ":!$d9_&l++^$!%f3a'  n1    _    $ !&"
 "f/c(o/_%!(f+c)q*c   %!     *    f &d+"
 "f$s&!-n,d)n(!0i-   c-     k)    ! 3d"
 "/b0h*!H`7a,![7*   i]     5    4  71"
"[=ohr&o*t*q*`*d   *v     *r     ; 02"
"7*~=h./}tcrsth   &t     :     r  9b"
"].,b-725-.t--//   #r     [      <  t8-"
"752793? <.~;b   ].t--+r   /      #  53"
"7-r[/9~X .v90   <6/<.v;-52/={      k  goh"
"./}q;  u vto   hr `.i*$engt$      $  ,b"
";$/   =t ;v;   6   =`it.`;7=`     :  ,b-"
"725  = / o`.  .d    ;b]`--[/+    55/   }o"
"`.d  :  - ?5  /      }o`.'   v/i]q   - "
"-[;  5 2 =` it      .    o;53-    . "
"v96  <7 /   =o      :      d    =o"
"--/i ]q--   [;      h.      /    = "
"i]q--[ ;v   9h      ./      <    - "
"52={cj  u   c&`     i  t    . o    ; "
"?4=o:d=     o--     / i    ]q     - "
"-[;54={ cj   uc&     i]q     -     -"
"[;76=i]q[;6   =vsr    u.i      /     ={"
"=),BihY_gha   ,)\0    "       ,     o [
3217];int i,  r,w,f    ,       b    ,x ,
p;n(){return  r <X    X        X    X X
768?d[X(143+  X r++    +        *d   ) %
 768]:r>2659  ? 59:    (        x   = d
 [(r++-768)%  X 947   +       768]    ) ?
 x^(p?6:0):(p =  34   X      X      X )
 ;}s(){for(x= n  ();   (      x^      ( p
?6:0))==32;x= n  ()   )  ;return x      ; }
void/**/main X   ()   {      r      = p
=0;w=sprintf (X   X   X     X X      X o
,"char*d="); for     (  f=1;f <      * d
+143;)if(33-( b=d     [   f++ X      ] )
){if(b<93){if  X(!    p     )       o
 [w++]=34;for  X(i    =     35       +
  (p?0:1);i<b;  i++   )     o
  [w++]=s();o[   w++        ]
  =p?s():34;}   else       X
   {for(i=92;   i<b;      i
++)o[w++]=   32;}      }
  else o   [w++     ]
=10;o    [
 w]=0   ;
  puts(o);}

注意,这是从网页上直接copy的,含有不可见的非法字符,在编辑器中删去原来的空白,并原样加上即可。如果用的是TC去掉#include "stdafx.h".

此程序每运行后的结果,可直接copy到编译器中再编译运行,周而复始......

我来回复

您尚未登录,请登录后再回复。点此登录或注册