C语言课件 第十四章 常见错误和程序调试_第1页
C语言课件 第十四章 常见错误和程序调试_第2页
C语言课件 第十四章 常见错误和程序调试_第3页
C语言课件 第十四章 常见错误和程序调试_第4页
C语言课件 第十四章 常见错误和程序调试_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十四章常见的错误和程序的调试,第十四章常见的错误和程序的调试,第14.1常见的错误分析14.2程序的调试,真的掌握c,很难很好地使用c,“灵活”是好的c编译器对语法的检查不像其他高级语言那么严格(这是为了给程序员留下“灵活”的馀地)。 因此,程序设计者本身往往必须保证程序的正确性。 调试c程序比调试PASCAL和FORTRAN程序更难。 需要积累经验,提高程序设计和调试程序的水平。 c语言的语法规定和其他高级语言不同,学习了其他高级语言的读者按照使用其他高级语言的习惯写c程序也是错误的原因之一。 14.1常见错误分析,列举初学者学习c语言使用时容易犯的错误,起到注意的作用。 (1)忘记了变量

2、的定义。 例如: main() x=3; y=6; printf(%dn,x y ),(2)输入输出数据的类型与使用的格式指定符不一致。 例如,假设a定义为整数,b定义为实数。 a=3; b=4.5; 在编译printf(%f%dn,a,b )时不会显示错误消息,但执行结果不是预期的。 (3)没有注意int型数据的数值范围。 在通常的微计算机中使用的c编译系统向一个整数数据分配2个字节。 因此,整数的范围为215215-1,即-3276832767。 常见的是PS;PS=89101; 得到printf(%d,num )是因为23565,89101超过了32767。 因为2字节不能容纳89101

3、,所以截断高位。 (4)输入变量时忘记使用地址符号。 例如应该写为scanf(%d%d,a,b) scanf(%d%d ),输入时数据的组织不符合要求。 使用scanf函数输入数据时,请注意输入数据的组织方法。 (6)错误地将“=”作为“相等”的比较子。 (7)句子后面去除了分号。 (8)在不应该加分的地方加了分号。 例如if(ab ); printf(aislarger than bn) (9)对于应该有括号的复合句,忘记加括号。 (10 )括号不符。 (11 )使用标识符时,忘记了大小写的差异。 示例:主() inta、b、c; a=2; b=3; C=A B; 编译printf(%d %

4、d=%、a、b、c )时发生错误。 编译器把a和a当作两个不同的变量名称,同样b和b,c和c分别表示两个不同的变量。 (12 )在引用数组元素时误用了括号。 例如,主() int I,a(10) for(i=0; i10; i ) scanf(%d,c语言中数组的定义和引用必须用括号括起来。 (13 )在定义数组时,将定义的“要素数”误认为“可使用的最大下标值”。 主() int a10=1,2,3,4,5,6,7,8,9,10; PS; for(i=1; i=10; I )在i ) printf(%d,ai) a10中,超出了a阵列的范围。 (14 )二维或多维数组的定义和参照方法有误。 主

5、() int 5,4; 误以为printf(%d,a12,2 ),(15 )数组名表示数组中的所有要素。 例如,主() int a4=1、3、5、7; 将printf(%d%d%d%dn,a )、(16 )字符数组和字符指针的差异混淆。 主() char str 4; str=计算机和c; printf(%sn,str )编译错误。 str是数组名称,表示数组的起始地址。 因为在编译时为str数组分配了内存单元,所以程序运行时str是常数,不能再分配。 (17 )在引用指针变量之前没有给出确定的值。 main() char*p; 在scanf(%s,p ),(18) switch语句的各分支上

6、写入break语句。 例如交换机(score ) case5:打印(ery good )! ); case4:打印机(good! ); case3:打印(通过! ); 情况2 :打印失败! ); 默认:打印(数据错误! ); 上述switch语句的作用是:我想根据score打印评论。 但是,score的值为5时,输出为ery Good! 好! 传球! 失败! 数据错误! (19 )混淆文字和字符串的表现形式。 char sex; sex=M; sex是字符变量,只能保持一个字符。字符常数的格式用单引号括起来,必须更改为sex=m。“m”是用双引号括起来的字符串,包含m和0两个字符,不能存储在字

7、符变量sex中。 (20 )使用自加( )和自减(- )运算符时的错误。 例如:主() intp,a5=1,3,5,7,9; p=a; 先执行printf(%d,*p) p,p的作用是先使用p的原始值,使用后给p加1。 因为p的原始值指向数组a中的第0个元素a0,*p是第0个元素a0的值1。 结论:首先输出a0的值,然后在p上加1。 *( p )的情况下,首先将p朝向a1,然后输出a1的值。 (21 )虽然习惯于用以往的方法声明函数形式参数,但是将函数的形式参数和函数中的局部变量混合起来进行定义。 例如: max(x,y) int x,y,=xy? x,y; return (); (22 )被

8、调用函数在语句被调用之前没有定义,并且在被调用之前没有描述。 将max函数的声明添加到main函数中。 将max函数的定义位置移动到main函数之前。 (23 )形状参数值的变化误会影响实际参数值。 (24 )函数的实参与形参类型不一致。 (25 )不同种类的指针混合存在。 主() int I=3,*p1; 浮点a=15、*p2; p1=p2也想指定I,但p2是指向实数型变量的指针,不能指定整数型变量。 指定到不同类型的指针必须进行强制类型转换。 (26 )没有注意函数参数的评价顺序。 例如i=3; printf(%d,%d,%dn,I,I ); 很多人认为输出必然是三、四、五。 在turbo

9、 c和其他c系统中,输出为5、5,4,混淆(27 )数组名称和指针变量的差异。 主() int I,a5; for(i=0; i5; I )通过改变i ) scanf(%d,a) a,将指针向下移动,指向要输入数据的数组元素。 该错误是因为不知道数组名表示数组的开头地址,所以不能变更其值,如果a错误,则应该用指针变量指示各数组元素。 (28 )把结构类型和结构变量的差异混淆,代入一种结构类型。 结构工作器长int num; char name20; char sex; int age; workernum=187045;strcpy(workername,张fun ) workersex=m;

10、 工作器age=18; 因为这是错误的,可以分配给变量,但不能分配给类型。 上面只定义了“结构工作器”类型,没有定义变量。 (29 )使用文件时忘记打开,打开方法不符合使用状况。 例如,对该文件的读写是以只读方式打开的,但是尝试向该文件输出数据。 例如,if(fp=fopen(test,r ) )=null ) printf (cannotopenthisfilen ); exit(0) ch=fgetc(fp) while(ch!=#) ch=ch 4; 对用fputc(ch,fp) ch=fget(fp) r”方式(只读方式)打开的文件进行读取和写入操作显然不行。 另外,也有容易忘记关闭文

11、件的程序,使用的文件会自动关闭,但可能会丢失数据。 因此,文件不见了就必须关闭。 以上只是列举了初学者常见的错误,其中很多错误都不熟悉c语法。 如果c语言的使用变多,熟练的话,就会自然地减少犯这些错误。 深入使用c语言会产生更深、更隐藏的错误。 程序错误有三种情况:语法错误。 逻辑错误。 执行错误。 程序既没有语法错误也没有逻辑错误,但是在运行时会发生错误,有时会停止执行。 例如int a、b、c; 输入扫描(% d % d,a和b的值,输出b/a的值。 程序是没错的。 但是,输入a的值为0时,会发生错误。 因此,程序应该能够适应不同的数据,或者应该具有能经得起各种数据的“考验”的“壮健性”。 程序调试是指程序的调试和调试。 调试器通常应该(1)首先进行手动检查,即静态检查。 (2)手动(静态)检查无误后,才能调整机器。 (3)修改语法错误(包括“错误”和“警告”)后,程序通过链路获得可执行的目标程序。14.2程序调试,(4)执行结果错误,大多是逻辑错误。 为了发现这样的错误,经常需要慎重地检查和分析。 将程序与流程图(或伪代码)进行良好对照,如果流程图正确,可以采用程序写错而容易发现的方法。 如果没有发现错误,可以采取“阶段性检查”的方法。 也可以使用第9章中说明的“条件编译”命令进行程序调试(在程序调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论