TOJ1072 输出为本身的C程序

输出为本身的C程序

狂FT.

http://acm.tongji.edu.cn/people/ps/showproblem.php?problem_id=1072

ACM竟然有这样的题目!

于是到google上搜了一下,果然有……

这类程序的技巧在于字符串定义时对ASCII为34和10即引号和回车符的妙用:

1.
char*f="main(){putchar('c');putchar('h');putchar('a');putchar('r');putchar('*');putchar('f');putchar('=');putchar(34);printf(f);putchar(34);putchar(';');putchar(10);printf(f);putchar(10);}";main(){putchar('c');putchar('h');putchar('a');putchar('r');
putchar('*');putchar('f');putchar('=');putchar(34);printf(f);putchar(34);putchar(';');putchar(10);printf(f);putchar(10);}

2.
char*f="char*f=;main(){f[7]=0;printf(f);putchar(34);f[7]=';';printf(f);putchar(34);f[8]=0;printf(&f[7]);f[8]='m';putchar(10);printf(&f[8]);putchar(10);}";main(){f[7]=0;printf(f);putchar(34);f[7]=';';printf(f);putchar(34);f[8]=0;printf(&f[7]);f[8]='m';putchar(10);printf(&f[8]);putchar(10);}

3.
char*f="char*f=%c%s%c;%cmain(){printf(f,34,f,34,10,10);}%c";
main(){printf(f,34,f,34,10,10);}

4.
char a='"';char b='/n';char c='//';char*f="char a='%c';char b='%cn';char c='%c%c';%cchar*f=%c%s%c;%cmain(){&printf(f,a,c,c,c,b,a,f,a,b,b);}%c";main(){printf(f,a,c,c,c,b,a,f,a,b,b);}

5.
char*lines[]={"char*lines[]={","%c%s%c%c%c","0};","main(){","int idx;","puts(lines[0]);","for(idx=0;lines[idx]!=0;idx++){","printf(lines[1],34,lines[idx],34,',',10);",
"}","puts(lines[2]);","for(idx=3;lines[idx]!=0;idx++){","puts(lines[idx]);","}","}",0};
main(){int idx;puts(lines[0]);for(idx=0;lines[idx]!=0;idx++){printf(lines[1],34,lines[idx],34,',',10);}puts(lines[2]);for(idx=3;lines[idx]!=0;idx++){puts(lines[idx]);}}

挑了其中最简单的一个,看懂以后,修改了一下:

#include <stdio.h>
char*f="#include <stdio.h>%cchar*f=%c%s%c;%cint main(){printf(f,10,34,f,34,10,10);return 0;}%c";
int main(){printf(f,10,34,f,34,10,10);return 0;}


呵呵,AC了,不过粘到Submit框里的时候还是要小心,别把最后一个回车漏掉。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值