
C语言调试常见错误可用.pdf
5页语言调试常见错误一、第一 类错误分析1、在使用变量前未定义2、语句后面漏写分号或不该加分号的地方加了分号C 语言规定,语句必须以分号结束,分号是C 语句不可缺少的一部分,这也是和其它高级语言不同的一点初学者往往容易忽略这个分号例如:x=1 y=2;修改:x=1;y=2;3、定义或引用数组的方式不对C 语言规定,在对数组进行定义或对数组元素进行引用时必须要用方括号(对二维数组或多维数组的每一维数据都必须分别用方括号括起来), 例如以下写法都将造成编译时出错:例如:int a(10); int b 5,4; printf( d n, b 1+2,2 ); 修改:int a10; int b54; printf( d n,b 32);4、混淆字符和字符串C 语言中的字符常量是由一对单引号括起来的单个字符;而字符串常量是用一对双引号括起来的字符序列字符常量存放在字符型变量中,而字符串常量只能存放在字符型数组中例如:char num; num= 1;修改:char num; num= 1;5、在引用数组元素或指针变量之前没对其赋初值例如:main()int a 6,b,*ptr;b=a 5 ; *ptr=b; 修改:main()int a 6 =0,1,2,3,4,5,b,*ptr; b=a 5 ; ptr=&b 6、混淆数组名与指针变量在 C 语言中,数组名代表数组的首地址,它的值是一个常量,不能被修改。
例如,在以下程序段中,用a+是不合法的例如:main() int i, a 10 ; for (i=0;i 10;i+) scanf( d, a+);修改:main() int i, a 10 ; int ptr=a; for (i=0;i 10;i+) scanf( d, ptr+); 7、混淆不同类型的指针若有以下语句:int *p1, a=1; float *p2; p1=&a; 则赋值语句p2=p1 是非法的8、混淆指针说明语句中的*号和执行语句中的*号设有以下说明语句:int *p1, i=1; 则*p1=&i; 是不合法的9、误将函数形参和函数中的局部变量一起定义例如:fun(x,y) float x, y, z; x+; y+; z=x+y; 修改:fun(float x, float y) float z; x+; y+; z=x+y; 10、调用的函数在调用前未定义11、混淆结构体类型名和结构体变量名若定义了以下结构体类型student:struct student long int num; char name 20 ; int age; float score; ; 则赋值语句:student.num=199401; 是错误的。
二、第二类错误分析1、在用 scanf函数给普通变量输入数据时,在变量名前漏写地址运算符& 如 :scanf( d d, x, y);2、在 scanf函数调用语句中,企图规定输入实型数据的小数位如执行以下语句: scanf( 6.2f , &a);3、输入数据时的数据形式与要求不符用 scanf函数输入数据时,必须注意要与scanf 语句中的对应形式匹配如:scanf( d, d,&x, &y);若按以下形式输入数据:2 4 是不合法数据2 和 4 之间应当有逗号4、输入、输出时的数据类型与所用格式说明符不匹配例如有以下说明语句:int x=1; float y=2.5; 则运行时执行语句printf(x=f, y=d n, x, y);将给出与原意不符的结果:(在 TURBO C 2.0 下运行 ) 5、混淆 = 和 = 在 C 语言中, = 赋值运算符,= 是关系运算符6、在不该出现分号的地方加了分号例如: if(x y);printf(x is larger than y. n);7、对于复合语句,忘记加花括号例如:i=1; a=0; while (i =10) a+=i; i+; printf(a= d n,a);8、误把数组说明时所定义的元素个数作为最大下标值使用。
C 语言规定,引用数组元素时下标从0 开始,即下标值的下限为0,而下标的上限值是数组定义时元素个数减19、在 switch 语句的各分支中未使用break 语句例如:switch(grade) case A : printf( 85 100n );caseB: printf(70 84n);caseC: printf(60 69 n);caseD: printf( 60 n);default: printf(Error n);10、混淆break 语句和 continue语句的作用例如:do scanf( d ,&x);if(x 0) break; printf( d n,x); while(x! =0); 11、使用 +或-运算符时易犯的错误如: main() int a 5=1, 2, 3, 4, 5,*p; p=a; printf( dn,*(p+); 12、误解形参值的变化会影响实参的值例如:main() int a=1, b=3; swap(a, b); printf(a= d, b= dn,a,b);swap(x,y) int x,y; int m; m=x; x=y; y=m; 原意想通过调用swap函数使 a与 b的值对换, 然而, 从输出结果可知a 和 b 的值并未进行交换。
