- 相关推荐
C语言常见错误分析及解决方法
C.C语言的应用很广泛,越来越多的程序员希望能够学好C由于C语言的编译系统对语法的检查不如其他语言那么严格,因此C语.下面将C语言中初学者最常见的错误分析如下;
1 语句书写错误
由于大部分学生都是初次接触程序设计语言,缺乏程序设计的实践,对C语言语句又比较陌生,因此在编写程序时经常出现丢三落四、画蛇添足的情况.语句书写错误主要有:
(1)语句结束未加分号或多加分号.C语言规定,分号作为语句的终止符,是语句中不可缺少的一部分.初学者经常忽略这个分号,如:
main(); structdate
{intyear;
intmouth;
intday;}{inta=1;……
以上两段程序在编译时都会出错.第一段程序在定义结构体变量时,没有添加终止结构定义的“;”,
第二段程序在函数定义中第一行的函数名后应该没有“;”.可见每一条语句的后边都要加分号,函数名后边不加分号.因此初学者要特别注意分号的使用.
(2){},[],(),′′,″″不配对.解决这个问题最好的方法是在写这些符号的时候先成对书写,然后再在中间添加语句.
(3)不该有空格的位置加了空格.例如,在关系运算符<=,>=,==,!=中,两个符号之间不允许有空格.
对于以上错误,初学者要相当小心,C语言程序虽然书写格式自由,但这些细节不能忽视.那么解决语句类错误的方法是增强感性认识,加深理解,在思维方式上形成固定的语句模式.初学者要多读程序,阅读程序是学习C语言入门最快、最简洁的方法.特别是对于一些没有学过计算机语言的初学者,应该先阅读教材,学习它们的编程格式、编程风格,多看一些优秀代码,拓展自己的思维能力,开阔眼界.2 定义、初始化、引用方式错误
此类错误涉及的是C语言的语法部分.语法是C语言的基础,只有掌握了语法,才能够编写程序.因此要求初学者熟悉C语言的每一个语法,并能根据这些语法来编程.那么C语言中常见的语法错误主要有:
211 使用未经过定义的变量
例如:
a,b;main()
{a=1;b=5;
收稿日期:2017—12—10
作者简介:朱一峰(1983-),男,辽宁朝阳市人,助教,主要从事计算机教学研究.
1994-2017 China Academic Journal Electronic Publishing House. All rights reserved. http://cankao.gcw818.com
朱一峰
}
a=1;B=5;
printf(″%d\n″,a+b);
} 41printf(″%d+%d=%d\n″,a,b,a+b); 又如:main() {inta,b;
以上两段程序在编译时都会出错.C语言要求对程序中用到的每一个变量都必须预先定义,并且严格区分大、小写英文字母.C语言程序习惯上使用小写英文字母,大写英文字母通常作为常量的宏定义和其他特殊的用途.
212 数组的定义与引用方式不正确
C语言规定,数组定义的形式采用“数组名+[常量表达式]式,不能出现变量或非整型值.(3(; (1)inta[j];
(2)intx=10,b[x];(4)213 3pt=&a;int3pt,a;
pt前面的“3”是一个指针声明符,表示是一个整形指针变量,在第二条语句中pt前面的“3”是指针运算符,也称为“间接引用运算符”,作用于指针变量,3pt表示指针变量pt所指向的存储空间,相当于变量a.另外,在使用指针前一定要对其进行初始化,否则系统在执行程序时会给出如下的信息:run-timeerrorR6001———nullpointerassigment或者引起更严重的错误使系统崩溃.214 定义函数时出现的错误
如:
);{printf(″insidesum\n″ (1)intfun(inta,intb)
{intresult;
result=a+b;
}
(2)intsum(void)intsum1(void));{printf(″insidesum1\n″}}
在C语言中,函数有返回值时要有返回值语句,第一段程序缺少“return;”语句;一个函数的定义不能从属于另外一个函数,因此函数不能嵌套定义,第二段程序应将函数sum1定义在函数sum之外.
解决语法类问题的最好办法是课上认真听讲、积极思考,课下多实践,具体做好以下几点.(1)养成良好的编程习惯.C语言的学习过程就是反复实践的过程,实践环节是非常重要的.要编出好的程序,就要通过上机操作来验证程序的正确性.多上机、勤上机不但可以提高个人反映速度、锻炼心理素质、增强心理承受能力,而且通过执行程序,初学者会发现程序中的错误,从而了解所学知识的不足,同时也能学会根据编译时系统提示的错误信息来改正程序中的错误.(2)学习C语言必须注意代码运行的细节.教材上的例子代码一定要自己动手上机运行一遍,编译、执行结果完全和教材上说的一致才算是学完一个例题,如果与教材不符,就要仔细查找出错原因.除了教材上现有的例子外,自己还要尽可能地“设计”一些程序,以便验证自己的想法是否正确.(3)初学者不要忽视课后习题,应该独立完成所有课后习题,然后参照习题答案中给出的代码,查看自己程序代码的不足,再修改自己的程序.大多初学者不重视习题的做法是错误的,因为作者通常会在习题中给出一些重要的编程思想,而不是简单的检验已学知识.3 混淆错误
《C语言常见错误分析及解决方法》全文内容当前网页未完全显示,剩余内容请访问下一页查看。
C语言中常见的易混淆错误主要有:
311 字符常量与字符串常量混淆
C语言规定字符常量是用单引号括起来的一个字符或用单引号括起来的以“\”字符开始的字符;字符串常量是用一对双引号括起来的字符序列.它们除在形式上不同外,其存储方式亦不同,字符常量在内存中占一个字节;字符串常量除了每个字符各占一个字节外,其字符串结束符“\0”也要占一个字节.不能将一个字符串常量赋给一个字符变量,如:
(下转100页)charc1,c2;c1=″a″;c2=″b″;
1994-2017 China Academic Journal Electronic Publishing House. All rights reserved. http://cankao.gcw818.com
100辽宁师专学报2017年第4期员,给一些人造成的印象是该体系只与领导有关,实际上整个管理体系的运行必须是全体人员参与,每个人都要明确本部门的质量目标和自己的工作职责,熟悉与自己有关的管理制度、考核办法,了解与自己有关的程序文件,在实际工作中,真正按照程序去做,将其作为工作中必须遵守的规范.
412 持续改进
运行ISO9000质量管理体系要强调持续改进,一层意思是所制定的文件要随着实践的检验,不断修改完善,使之更加符合实际,起到程序化高效管理的效果;另一层意思是在体系运行过程中,对工作中发现的新问题要不断改进,达到更好的目标.持续改进体现了一种创新工作精神,不能把ISO9000质量管理体系本身当成是僵化的死框框,一定要正确理解ISO9000质量管理体系的涵义.5 结语
通过辽宁机电职业技术学院的实践,证明ISO9000不断提高,.,如学校整体人事制度改革还没有到位,,这些都有待于在今后不断改进.
(审稿人 胡 坤,责任编辑 朱成杰)
(上接41页)
312 使用自增与自减运算符时出现的混淆错误
如:
main()
{
intx=2,y=3;printf(″i=%d,j=%d\n″,++x+y,++y+x);}程序的运行结果为:i=7,j=6
对函数参数的求值顺序是从右至左,所以printf函数中先求第2个表达式++y+x的值,y自增1后其值变为4,然后加x结果为6;再求第1个表达式的值,x自增1后其值变为3,然后加y结果为7.313 误认为形参值的变化会影响实参值的变化
如:
voidmain() intsum(inta,intb)
{a=a+b;
b=a+b;
returna;
}{inta=1,b=3,c;c=sum(a,b);printf(″%d,%d,%d\n″,a,b,c);}
输出结果为:1,3,4.C语言的“值传递”既可以在函数之间传递“变量的值”,也可以在函数之间传递“变量的地址”.而“传值”只能实现外部数据向函数内部数据的传递,而不能实现函数内部数据的传出.因此,a、b改变只改变子函数中的a、b的值,输出时主函数中的a、b值不发生变化.314 break语句与continue语句处理过程混淆
break语句作用是终止循环或switch结构.在循环体内,使用break语句可退出循环体(不等循环的正常结束)而执行该循环语句后面的语句,相当于程序多了一个出口.
continue语句作用是结束本次循环(不是终止整个循环),跳过循环体中continue语句后面的语句,返回循环语句的首部,检查是否满足循环条件以决定是否开始下一次循环.
解决混淆类问题的办法其实很简单,主要有:(1)将易混淆错误根据教材章节进行合理分类,找出两者的区别,记住这些区别就可以了.有些区别在理解后会更容易记忆.(2)初学者可以尝试用抄教材源代码的办法来解决易混淆问题,因为有一些代码需要通过多次实践才能熟练掌握,这样不仅能够解决问题,还能积累经验,提高自己的编程能力.一般说来,学完整本教材,应该完成数千行乃至上万行的代码,不管是原封不动照抄教材上的,还是心血来潮随意编写的,都将成为今后继续学习的一笔宝贵财富.
以上例举出一些初学者在学习C语言时最容易犯的错误,对错误产生的原因进行分类分析,并提出相应的解决办法.随着学习的不断深入,只有通过大量的上机实践,积累更多的程序设计经验,才能熟练掌握和运用C语言.
C语言常见错误及解决方法2017-03-22 21:04 | #2楼
既然我前边总结了那么多关于c语言常见错误那么现在给大家分享一下c语言常见错误及解决方法,关于c语言常见错误及解决方法是针对大家的通病说提出的解决方法,大家可以参考一下。
《C语言常见错误分析及解决方法》全文内容当前网页未完全显示,剩余内容请访问下一页查看。
c语言常见错误及解决方法一、基础知识和数据类型、表达式、掌握关键词的具体用法及适用范围对象。
1、 拼写错误,尤其是include,main,void,float等词。c语言的32个关键字与基本含义如下:
double :声明双精度变量或函数
int: 声明整型变量或函数
char :声明字符型变量或函数
float:声明浮点型变量或函数
void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
auto :声明自动变量 一般不使用
struct:声明结构体变量或函数
break:跳出当前循环
else :条件语句否定分支(与 if 连用)
long:声明长整型变量或函数
switch :用于开关语句
case:开关语句分支
enum:声明枚举类型
register:声明积存器变量
typedef:用以给数据类型取别名(当然还有其他作用)
extern:声明变量是在其他文件正声明(也可以看做是引用变量)
return:子程序返回语句(可以带参数,也看不带参数)
un-io-n:声明联合数据类型
const :声明只读变量
short :声明短整型变量或函数
unsigned:声明无符号类型变量或函数
continue:结束当前循环,开始下一轮循环
for:一种循环语句(可意会不可言传)
signed:生命有符号类型变量或函数
default:开关语句中的“其他”分支
goto:无条件跳转语句
sizeof:计算数据类型长度
volatile:说明变量在程序执行中可被隐含地改变
do :循环语句的循环体
while :循环语句的循环条件
static :声明静态变量
if:条件语句
2、 {},[],(),‘’,“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。
3、 忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。
4、 混淆/和\;注释对应的符号是,而转义字符是以\开头,除号是/。
5、 printf()和scanf()的参数设置有误,主要表现在以下几方面:
l 类型不匹配的问题。(例如:有floata=3.5,但输出的时候printf(“a=%d”,a);则屏幕上会显示出a=0.00000或者提示其它运行错误)。基本原则是:float对应%f,int对应%d, char对应%c。
l 个数不匹配。无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容,表示输出格式。剩下的n-1个是输出的变量或者输入的变量的地址。需要注意的是,如果后边有n-1个参数,那么前边一定对应n-1个%f一类的格式说明符。
l scanf()中变量前忘了加&。记住:scanf()中变量前要有&(但后边学到的字符数组名和指针前不用加)
6、 定义标识符的时候经常出现使用非法字符的情况,例如:标识符中不能用空格,也就是说不能有这样的定义:int radium ofcircle;一般情况下可用下划线将三个单词连接在一起。
7、 在使用变量前未定义,或未初始化。例如:若下边的sum未定义,则在编译时会提示相应的错误信息,而若未初始化为0,则求和的结果一定是错误的。
void main()
{ int i,a[10], sum=0;
for(i=0;i<10;i++) sum+=a[i];
printf(“%d”,sum);
}
8、 符合常量定义错误 。例如:#definepi=3.14159,这里的=应该换成空格。
9、 计算错误。主要注意:++,――和其它运算符一起运算时,除根据优先级进行计算时,还要考虑先后位置的特殊含义;数据类型不一致时发生的自动转换也会导致计算的误差;还要注意求模结果的符号与被除数相同;某些特殊情况下 使用懒惰求值法。
10、不能除以0,要做合法性检查;
11、类型溢出。记住每种数据类型的取值范围,确保数据在所定义类型范围之内;
12、数学表达式的格式有误。常见的有:(1)数学与c语言运算表达式的混淆(例如:=表示赋值,而==才表示我们数学中的相等关系)。(2)、忽略了运算的优先级。解决这个问题的最好方法就是写数学表达式时不要从左到右,而是按优先级的顺序写,写完优先级高的一个表达式后加上()再写下一级的表达式,例如:计算梯形的面积时,要s=((a+b)*h)/2,不要1/2*a+b*h.(3)忽略了计算和赋值时的自动转换。例如:floathalf=1/2;这样,因为=右边是整数相除的结果为整数0,不会得到0.5存入half,进而会影响下边的计算结果。要想不在这儿绊跟头,当计算不同类型的数据时,一定注意会不会出现引起错误的自动转换,建议最好加上强制转换。(4)赋值号左边不是变量,例如:若有#definepi3.14,程序中又出现pi=3.14159。又例如:f(n)=f(n-1)*n(这是典型的数学语言,在c语言中右边的乘积不能正确存储,而左边又是一个函数调用)。
13、使用库函数前,尤其是数学函数忘了加#include<?.h>。
c语言常见错误及解决方法二流程控制,了解控制流程的来龙去脉,掌握起运行规律。
1、 丢掉语句结束标记“;”,尤其是for语句中表达式后或do-while语句后的分号,或在预处理命令后边、while()后、for()后加“;”;
2、 if语句或循环语句中逻辑表达式或关系表达式书写错误。一定要注意c语言的条件与数学表达式的区别(例如我们数学中经常写到的0≤x≤9,在c语言中应该写成x>=0&&x<=9)。
3、 if-else嵌套时不配对。最好在写每个条件时要用两个{}分别将两个分支先括起来,再添加其中的语句,以保证其配对不易错。
4、 switch()语句中的格式不正确。()中的表达式结果一定是一些明确的值,不能是区间;表达式的所有可能结果要列在case后边,case与常量之间有一空格,不要丢掉必要的break;
5、 随意修改循环控制变量i的值,导致循环次数的改变,尤其是当循环有嵌套时。在循环体中,不要将循环控制变量进行另外的改变。
6、 分不清什么情况下用双重循环,什么情况下用两个控制变量写成一重循环。当i不变,j又循环一遍的时候用双重循环。当i,j同时变化的时候用一重循环,此时,循环控制变量有两个,但条件只写一个就可以,因为另一个总是进行相应的变化的。
7、 忽略循环体与循环控制变量的关系。其实,很多情况下,循环控制变量都在循环体中起到非常重要的作用。应该利用上这种关系。
三、数组与指针
1、 字符串的输入有错误:主要表现在使用scanf()或gets()时加了&,或输入字符串时用循环,(这样的话,字符个数无论多长,都不会为自动加\0,将来引用的时候也就不能以字符串的形式引用。)
2、 对字符串的处理中,循环条件仍然写成i<n。由于字符串是不定长的,所以循环条件一般为str[i]!=’\0’或i<strlen(str)
3、 而输入所对应的变量是指针时(常见的有:输入的变量是字符数组名或指向字符串的指针)不能加&。
4、 指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=null赋初值,以避免引起的灾难性错误。
5、 分不清p和*p。前者是指针,即地址,后者表示指针所间接引用的数据,但如果是二级指针或多级指针,取*以后得到的仍然可能是地址。
四、函数
1、 函数定义的时候,函数头部加分号,而函数声明的地方忘了加分号
2、 函数实参格式不对,主要表现在:给出实参时,多给出数组类型,或者,形参是数组inta[];的时候,给出的a[]或a[i].
3、 递归时忘了设置边界条件,这样易造成死循环调用。
4、使用函数之前未声明(包括c库函数的声明)。建议大家,将所定义的一切函数都在程序开始的预处理命令后加上函数原型的声明,这样做不仅可以避免错误,而且整个程序的结构看起来更清楚。
五、结构体共用体
1、 结构体类型定义有误,主要表现在:结构体类型里还有嵌套的时候,忘记了成员名称。(例如:下边的例子中,有些同学经常忽略了birthday)
2、 结构体类型名和结构体变量名混淆。例如:
struct stu
{….
struct data
{int year,month,day;
}birthday
};
struct stu a; struct stu是类型名称,而且不分配空间,且不能直接引用。只有定义了结构体类型structstu的变量a以后,才为a分配相应的内存空间,引用时也要是a.???
3、 结构体变量的成员引用不正确,尤其是当结构体类型中有嵌套定义的时候。一定要一级一级的引用。例如:上边的例子:如果引用其中的年的话,一定是a.birthday.year. 不能直接a.year.
4、 对结构体变量进行输入输出的时候,整体输入或整体输出。除作为函数参数外,不能对结构体变量整体操作,只能一个成员一个成员地输入、输出。
5、 不理解共用体的“共占内存”。对共用体中的成员变量,一定要靠一个标记区别它们,并分别按不同类型引用它们。切记:共用体变量不能做函数形参。
六、文件
1、 使用之前没有打开文件,使用之后没有关闭文件。
2、 相关函数的调用格式有误。请一定注意实参的类型、顺序、个数上与函数原型(或函数声明)的一致。
【C语言常见错误分析及解决方法】相关文章:
电脑硬盘的常见错误提示及解决方法09-22
Matlab常见语法错误及解决方法转02-26
SQLServer连接中常见错误解决方法12-05
SQL数据库连接常见错误的解决方法09-22
锅炉安全阀的常见故障分析和解决方法09-22
错误711的解决方法09-22
explorerexe错误的解决方法09-22
loadrunner错误及解决方法总结09-22