您的位置:首页 > 其它

写一个能输出自己的c程序

2014-10-10 15:07 183 查看
今天晚上和一个大一的孩子讨论C语言的问题,闲来无事又看到这个孩子很好学,就出了一个很经典的问题给她:写一个程序输出程序代码本身(不能把源程序open之后输出出来)。

对于很多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程序应该没有问题,而且运行较为稳定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐