写一个能输出自己的c程序
2014-10-10 15:07
183 查看
今天晚上和一个大一的孩子讨论C语言的问题,闲来无事又看到这个孩子很好学,就出了一个很经典的问题给她:写一个程序输出程序代码本身(不能把源程序open之后输出出来)。
对于很多C语言的牛人来说这种问题简直就是糊弄小孩的,好吧,我这个题就是出给小孩纸的;) 在等她解答的过程中我也自己尝试的写了一个程序print_myself.c:
写的时候发现需要使用转义字符'\'的地方,如,\t,\" 等的会导致需要输出的转义字符无限递归下去很难解决,然后就尝试把需要转义字符的地方替换成ascii码对应的数值,避免使用转义字符,然后递归就停止了,看到了出口。于是就出现了上面的程序。
此程序在Fedora 19系统上完成,如果换到别的系统可能会有出入。
然后一看她还没做完,我就又闲着写个测试程序好了,如下runtest.sh:
此测试程序尝试不断的编译运行程序,并把程序的输出输出到新的文件里,比较新文件和上一次编译的源程序。然后再编译新文件运行,再输出到新的文件里,再比较最新的文件和上一次编译的源程序.....如此往复。比较的深度,由参数控制。最后执行结果如下:
[zorro@dhcp-65-110 tmp]$ ./runtest.sh 10
TEST PASSED !
[zorro@dhcp-65-110 tmp]$ ./runtest.sh 100
TEST PASSED !
看来上述C程序应该没有问题,而且运行较为稳定。
对于很多C语言的牛人来说这种问题简直就是糊弄小孩的,好吧,我这个题就是出给小孩纸的;) 在等她解答的过程中我也自己尝试的写了一个程序print_myself.c:
#include <stdio.h> int main() { char *str1 = "#include <stdio.h>%c%cint main()%c{%c%cchar *str1 = %c%s%c;%c%cprintf(str1, 10, 10, 10, 10, 9, 34, str1, 34, 10, 9, 10, 9, 10, 10);%c%creturn 0;%c}%c"; printf(str1, 10, 10, 10, 10, 9, 34, str1, 34, 10, 9, 10, 9, 10, 10); return 0; }
写的时候发现需要使用转义字符'\'的地方,如,\t,\" 等的会导致需要输出的转义字符无限递归下去很难解决,然后就尝试把需要转义字符的地方替换成ascii码对应的数值,避免使用转义字符,然后递归就停止了,看到了出口。于是就出现了上面的程序。
此程序在Fedora 19系统上完成,如果换到别的系统可能会有出入。
然后一看她还没做完,我就又闲着写个测试程序好了,如下runtest.sh:
#!/bin/sh if [ $# -ne 1 ]; then echo "usage: runtest.sh <testdeep>" exit 1 fi DEEP=$1 if ! [ "$DEEP" -gt 0 ] 2>/dev/null; then echo "the argument must be a number, and more than 0" exit 1 fi PROG="print_myself" mkdir testdir >/dev/null 2>&1 cp -f $PROG.c testdir/ pushd testdir >/dev/null for i in `seq 1 $DEEP`;do gcc -o $PROG $PROG.c -Wall if [ -f $PROG ]; then ./$PROG > test$i.c diff -Nup $PROG.c test$i.c if [ $? -ne 0 ]; then echo "Test Failed on deep $DEEP - diff failed !!" exit 2; fi PROG="test$i" else echo "Test Failed on deep $DEEP - can't compile !!" exit 2; fi done echo "TEST PASSED !" popd >/dev/null rm -rf testdir/ exit 0
此测试程序尝试不断的编译运行程序,并把程序的输出输出到新的文件里,比较新文件和上一次编译的源程序。然后再编译新文件运行,再输出到新的文件里,再比较最新的文件和上一次编译的源程序.....如此往复。比较的深度,由参数控制。最后执行结果如下:
[zorro@dhcp-65-110 tmp]$ ./runtest.sh 10
TEST PASSED !
[zorro@dhcp-65-110 tmp]$ ./runtest.sh 100
TEST PASSED !
看来上述C程序应该没有问题,而且运行较为稳定。
相关文章推荐
- 这段程序还搞错一个输出(写在这里提醒自己)
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC
- 笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 一个难题: 怎样写一个输出自己源代码的程序?
- 一个难题: 怎样写一个输出自己源代码的程序?
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 怎样写一个输出自己源代码的程序
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 第四题(迅雷笔试题):编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.