作者:未知 来源:未知 加入时间:2004-8-10 开发文档
下面是我以前写代码时遇到的一个小程序,问题不大,但是忙活了好半天!下面我就用比较正是的方式来将这段经历送给大家。 请在vi编辑器下编写这段代码. /*a.c*/ #include<stdio.h> main() { int I = 0; while(I != 1) { scanf(“%d”, &I); } } 我曾经问过几个朋友:这段代码有没有问题;都说:应该没问题吧!那么我们来测试一下。 我们先写一段简单的makefile 下面在UNIX下输入 $vi makefile 在vi编辑器下编辑下面这段代码 #这是一段makefile代码 #作用是:编译a.c成可执行文件a HEADERS = include/stdio.h SOURCES = a.c PRODUCT = a CC = cc $(PRODUCT):$(SOURCE) $(CC) -o $(PRODUCT) $(SOURCES) 编辑完成后,我们来执行makefile $ make<回车> cc -o a a.c 现在一个可执行的a已经生成了,下面开始写我们的单元测试计划 测试编 号 | 输入 | 输出 | 测试结果 | 分析 | 1 | 1<回车> | 跳出 |
|
| 2 | 2<回车> | 进入下一次输入状态 |
| 3 | 1.2<回车> | 跳出 |
| 4 | 1.9<回车> | 跳出 |
| 5 | 0.9<回车> | 进入下一次输入状态 |
| 6 | a<回车> | 进入下一次输入状态 |
|
$ a 1 $ … … … 边测试边填写测试计划表 测试编 号 | 输入 | 输出 | 测试结果 | 分析 | 1 | 1<回车> | 跳出 | 正确 |
| 2 | 2<回车> | 进入下一次输入状态 | 正确 | 3 | 1.2<回车> | 跳出 | 正确 | 4 | 1.9<回车> | 跳出 | 正确 | 5 | 0.9<回车> | 进入下一次输入状态 | 正确 | 6 | a<回车> | 进入下一次输入状态 |
|
看样子没问题,还有一步就完成了,输入一个非数值,a,回车!好像没问题!再输入1回车!!问题出现了!没有退出循环!Ctrl+c退出吧! $ a.out a 1
^C$ 测试编 号 | 输入 | 输出 | 测试结果 | 分析 | 1 | 1<回车> | 跳出 | 正确 | 此代码有一处严重错误将不予以发布 | 2 | 2<回车> | 进入下一次输入状态 | 正确 | 3 | 1.2<回车> | 跳出 | 正确 | 4 | 1.9<回车> | 跳出 | 正确 | 5 | 0.9<回车> | 进入下一次输入状态 | 正确 | 6 | a<回车> | 进入下一次输入状态 | 出错 |
为什么会这样呢?出现了严重的BUG,马上调试。首先让我们在scanf语句后面加上一句: printf(“%d”, I),看一看究竟I后来发生了什么样的变化,然后重复编号6的测试步骤,你会发现程序执行进入了死循环!它在不停的打印0!也就是说scanf根本不执行了!为什么会这样呢?我们的scanf 去哪里了?经过一番认真学习和听取老师们的指导终于明白,原来是这样的。先看下面的概念。 scanf在发生输入错或者读到了EOF关闭本页 |