语法错误的位置能很快地被编译器找到,而运行时错误的位置却很难被发现。即使我们一条条的检查语句,也未必能检查出什么,所以,今天我们来学习一下如何查找导致运行时错误的语句。
我们知道,带有运行时错误的程序是可以运行的。当它运行到一个产生错误的语句时就提示出错了。根据这个特点,可以用输出语句来判断程序运行的流程。下面我们来看一段有运行时错误的程序。
在程序运行结束之前,提示debug error ,它属于一种运行时错误。而根据输出的内容,发现程序也没有达到连接字符串的目的,所以我们让程序输出更多的信息,查找错误原因。首先在计算字符串a和b的长度后,输出它们的长度,添加输出语句:
Oottma字符串长为6,tomatstudio字符串长为12,根据程序运行结果,我们发现计算出来的字符串长度有问题。所以我们必须检查实现该功能语句,另外,由字符串长度可以想到申请空间是否足够的问题。发现数组的空间只能存放5个字符,而现在两个字符串都已经超出了这个限制。于是,把数组空间扩大,改成char a[20],b[20]
运行后发现字符串a的长度已经正确,可是字符串b的长度为什么不对呢?经过多次尝试,我们发现,正确的字符串长度总是较短的字符串。所以我们想到检查循环继续条件是否正确,如果过早的终止循环就会导致这种情况,果然,a[i]!='0'&&b[i]!='0'意味着只要有一个字符串结束,那么长度计算就结束了,因此把&&改成‖。
这样一改,居然两个字符串长度输出都错了,通过思考发现:用一个for语句来计算两个字符串长度,当循环控制变量越过任意一个字符串的结尾符以后又误认为它没有结束,所以输出的长度远远大于字符串的实际长度。我们把计算字符串长度用两个for语句来实现,修改程序如下:
运行结果,两个字符串长度都输出正确了,输出的内容也实现了两个字符串的连接,但是debug error 依然存在,继续检查,发现剩下的语句和申请的堆内存空间字符串c有关了。于是检查c是否有越界访问,根据c申请的空间大小,发现for语句中循环的条件有错误,导致越界访问,把它改成i
再次运行,debug error没有了,看来造成这个错误的原因就是越界了,但是现在输出的字符串后面有乱码,可能是结尾符被忽略了。检查程序发现alen+blen是两个字符串的长度,但是没有考虑结尾符,所以要给字符串c增加一个字符空间,改写程序如下
至此,程序修改完成,在目前的测试数据下不在出现运行时错误,并且也能实现字符串的连接功能。
本篇完!欢迎大家收藏与转发,下一篇《调试工具debug》