输出自身源代码的程序

很有名的一道编程题.

 

下面是用c#语言实现的.

原理:用格式化字符串的方法动态改变输入值.

ExpandedBlockStart.gif 代码
1  using System;
2  using System.Text;
3  namespace HelloPrintSelf
4  {
5      class Program
6      {
7          static   void Main()
8          {
9              string s =   " using System;using System.Text;namespace HelloPrintSelf{ class Program { static void Main()   {   string s =\ " % s\ " ; s = MyPrintf(s, s);Console.Write(s);Console.Read();}    static string MyPrintf(string format, string arg)        {            StringBuilder builder = new StringBuilder(format);            int index = format.IndexOf(\ " % s\ " );            builder.Remove(index, 2);            string escapedStr = Escape(arg);            builder.Insert(index, escapedStr);            return builder.ToString();        }   internal static string Escape(string src)        {            char[] arr = src.ToCharArray();            StringBuilder builder = new StringBuilder();            for (int i = 0; i < arr.Length; i++)            {                if (arr[i] == (char)0x22)                {                    builder.Append((char)0x5c);                    builder.Append(arr[i]);                }                else if (arr[i] == (char)0x5c)                {                    builder.Append((char)0x5c);                    builder.Append(arr[i]);                }                else                {                    builder.Append(arr[i]);                }            }            return builder.ToString();        } }} " ;
10              s = MyPrintf(s, s);
11              Console.Write(s);
12              Console.Read();
13          }
14 
15          static   string MyPrintf( string format, string arg)
16          {
17              StringBuilder builder =   new StringBuilder(format);
18              int index = format.IndexOf( " %s " );
19              builder.Remove(index, 2 );
20              string escapedStr = Escape(arg);
21              builder.Insert(index, escapedStr);
22              return builder.ToString();
23          }
24 
25          internal   static   string Escape( string src)
26          {
27              char [] arr = src.ToCharArray();
28              StringBuilder builder =   new StringBuilder();
29              for ( int i =   0 ; i < arr.Length; i ++ )
30              {
31                  if (arr[i] == ( char ) 0x22 )
32                  {
33                      builder.Append(( char ) 0x5c ); builder.Append(arr[i]);
34                  }
35                  else   if (arr[i] == ( char ) 0x5c )
36                  {
37                      builder.Append(( char ) 0x5c );
38                      builder.Append(arr[i]);
39                  }
40                  else
41                  {
42                      builder.Append(arr[i]);
43                  }
44 
45              } return builder.ToString();
46          }
47      }
48  }
49 

转载于:https://www.cnblogs.com/netfuns/archive/2010/06/16/1758952.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值