APP下载

浅析C语言程序调试过程及编程常见错误

2009-10-26袁立敏

新媒体研究 2009年13期
关键词:语法错误数组C语言

王 诺 袁立敏

[摘要]在讨论说明C语言程序调试过程的基础上,根据实践,结合实例,总结程序调试运行过程中常出现的错误,并依据C语言的语法格式和编程规则,对这些错误进行详细的说明和纠正,以提高学习者的编程效率。

[关键词]C语言调试编译语法错误逻辑错误

中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0710049-01

《C语言程序设计》作为一门计算机技术基础课程,在国内外得到了广泛应用。它功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高。但是由于C语言涉及到的概念比较复杂,规则繁多,使用灵活,不少初学者在学习使用时都感到编辑的程序调试运行时容易出错。鉴于此,本文在讨论说明C语言程序调试过程的基础上,结合实例总结了程序调试运行过程中常出现的错误,以便给学习者以帮助。

一、C语言程序调试过程

所谓程序调试是指检查程序的错误以及改正程序的错误。调试程序一般包括以下四个阶段:1.编写程序并查错;2.在C语言的编译系统(Turbo C或者VC++6.0)中编辑源程序;3.对程序进行编译链接,并及时发现程序中存在的错误;4.最后改正错误。C语言程序的错误主要分为两类:语法错误和逻辑错误。

二、C语言编程过程中常见错误

(一)常见语法错误分析

1.书写主函数时需要注意的问题。

例:

main

{ int i,j,z;

scanf("%d,%d",&i,&j);

z=i+j;printf("%d",z);

}

此程序在编译时会提示:Declaration syntax error。出现此提示说明在源文件中,可能是某个说明丢失了某些符号或输入了多余的符号。此程序就是丢失了main函数后面的“( )”。初学者比较容易犯这个错误。主函数正确的写法是main( )。

2.语句后面漏写分号。

例: main( )

{printf(“癶”?

}

C语言规定语句末尾必须有分号。分号是C语句不可缺少的一部分。此例中printf(“癶”?语句后面未写分号,会提示Statement missing ; in function main。我们根据此提示来修改程序。这也是初学者比较容易犯的错误。

3.在不该加分号的地方加了分号。

例:

int a=3,b=2;

if(a>b);printf("max=%d ",a);

此程序本意为当a>b时输出“max=3”的信息。但由于在if(a>b)后加了分号,因此if语句到此结束。即当(a>b)为真时,执行一个空语句,本来想a≤b时不输出上述信息,但现在printf函数语句并不从属于if语句,而是与if语句平行的语句,所以,无论a是否大于b,都会输出“max=3”的信息。因此在if、switch、for、while语句中,不要多加分号。

4.在调用库函数时,没有写预编译命令。

例:

main()

{charc;

printf("Please input one character: ");

c=getchar( );/*输入1个字符并赋给ch */

putchar(c);

}

调试程序时,出现错误提示:Undefined symbol'_getchar' Undefin

ed symbol'_putchar'。因为在使用库函数时,要用预编译命令#include将有关的头文件包括到用户源文件中。因此,必须在程序的开头加上预编译命令:#include “stdio.h”。

(二)常见逻辑错误分析

1.输入输出的数据的类型与所用格式说明符不一致。

例:

main()

{ int x;float y;

scanf("%f,%d",&x,&y);

printf("%f%d ",x,y);}

此段程序中x定义为整型,y定义为实型。而在输入输出x,y时用的格式说明符为%f,%d,这显然与定义不符。程序运行时并不提示语法错误,但是不能得出正确结果。因此,输入、输出函数语句分别应改为:scanf("%d,%f",&x,&y); printf("%d%f ",x,y);

2.复合语句忘记加花括弧。

例:

main()

{ int day,x1,x2=1;

for(day=9;day>0;day--)

x1=(x2+1)*2;x2=x1;

printf(“total=%d ”,x1);

}

此程序本意是从第二次循环开始,直到for循环结束,这个过程中每次循环时,x2变量的值是上次循环所得出的x1的值,但实际执行时,x2变量的值并没有变化,自始至终都是1,这显然与原意不符。原因就是:for循环的循环体语句应该是“x1=(x2+1)*2;x2=x1;”组合而成的复合语句,而不应该只是“x1=(x2+1)*2;”。因此正确的程序是:

main()

{ int day,x1,x2=1;

for(day=9;day>0;day--)

{x1=(x2+1)*2;x2=x1;}

printf(“total=%d ”,x1);

}

3.在使用数组的时候,出现数组下标越界的情况。也就是把定义的“元素个数”误认为是数组的最大下标值。

例:

main()

{int i, s[6]; printf("input 6 umbers: ");

for(i=0;i<6;i++)scanf("%d",&s[i]);

printf("%d",s[6]);

}

此程序本意是输出数组s中最后一个元素的值,但是输出的结果是个不确定的值。因为C语言规定,定义时,数组名后面的方括号内的数字表示的是数组的元素个数,而数组的下标从0开始,因此数组s的元素为s[0]、s[1]、s[2]、s[3]、s[4]、s[5],所以此程序中的数组元素s[6]是不存在的。

所以要想输出数组s的最后一个元素,应书写为:printf(“?”?s[5]);

4.混淆break语句和continue语句的作用。

例:将100~200之间不能被3整除的数输出。

main()

{int n;

for(n=100;n<=200;n++)

{if (n%3==0)break;

printf(“%d”,n);}}

该程序能够运行,输出的结果是:100 101,这显然不是正确结果。程序运行时当遇到能被3整除的数102时,循环结束,而本意是结束本次循环。学习者要牢记break语句是结束整个循环,而continue语句才是结束本次循环。所以正确的程序是:

main()

{int n;

for(n=100;n<=200;n++)

{if (n%3==0) continue;

printf(“%d”,n);}}

以上我们通过实例,列举了C语言学习者经常易犯的一些语法错误和逻辑错误,并根据C语言的语法格式和编程规则对出现错误的原因进行了分析,同时给出纠正后的程序。希望本文对C语言的学习者有所帮助,学习者在编程时应严格按照C语言语法规则编辑调试源程序,在实践中提高自己编写程序的能力。

参考文献:

[1]田淑清,全国计算机等级考试二级教程-C语言程序设计(2008年版),北京:高等教育出版社,2007年8月.

[2]徐新爱,C语言的变量剖析[J].电脑开发与应用,第20卷第6期.

[3]谭浩强,C语言程序设计[M].第2版,北京:清华大学出版社,2000年.

猜你喜欢

语法错误数组C语言
JAVA稀疏矩阵算法
“C语言程序设计”课程混合教学探索
JAVA玩转数学之二维数组排序
基于C语言的计算机软件编程技术探究
中职C语言单片机课堂教学中的趣味性探讨
更高效用好 Excel的数组公式
计算机原理中C语言的应用价值
汉语负迁移对英语写作的影响及启示
高中英语写作中的语法错误分析
寻找勾股数组的历程