http://uoj.ac/problem/8

题意:一个程序输出它自己。

很经典的一个问题,虽然看上去是个无穷递归的不可解问题,但利用C语言字符串的特性或者编译器可以做到。

参考 https://www.cnblogs.com/xkfz007/archive/2012/03/27/2420162.html

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

以上代码中在运行printf时字符串s里的 %c%s%c 又被解析为34(双引号的ASCII码),s,双引号。那么为什么在第二个s里没有再解析呢?可能是编译器的设定吧。

 

1
2
#define q(k)main(){return!puts(#k"\nq("#k")");}
q(#define q(k)main(){return!puts(#k"\nq("#k")");})

看不懂第二种。

 

还有用宏定义字符串化的

1
2
3
4
5
#include <iostream>
using namespace std;
#define ENIUQ(TEMPLATE) cout << TEMPLATE << "(" << #TEMPLATE << ");return 0;}";
int main()
{ENIUQ("#include <iostream>\nusing namespace std;\n#define ENIUQ(TEMPLATE) cout << TEMPLATE << \"(\" << #TEMPLATE << \");return 0;}\";\nint main()\n{ENIUQ");return 0;}

 

还有几种uoj似乎不行。

__FILE__调用了自身的文件,就是真正的照着自己输出。

1
2
3
4
5
6
7
8
#include <stdio.h>
char buff[80];
int main() {
FILE *fp;
fp = fopen(__FILE__, "r");
while (!feof(fp)) {printf("%s", fgets(buff, 79, fp));}
fclose(fp);
}