计算机C语言考试常见错误分析
- 格式:doc
- 大小:21.00 KB
- 文档页数:3
C语言常见错误解析:1)编译错误和运行错误:1,选择编辑的文件类型不是C语言。
如:文件扩展名不是.cpp, 而是.asp等。
重做。
错误提示:解析:编辑区上方的文件名的扩展名为:.asp是网站文件, 不是正常的.cpp文件。
当然编译菜单为灰色,无法编译。
2,做完一个程序后,没有关闭工作区,继续做下一个程序,编译系统无法确定编译多个主函数中的哪一个。
关闭工作区后,重做(这时,可使用复制粘贴方法)。
错误提示:解析:左边看出,有两个main()函数,原来的是t.cpp(工程名也是t), 现在的是li.cpp,可以编译,但不能运行。
每次运行的都是原来的程序t.exe.同时,可以看到,编译的主文件名li.cpp,与构件的文件名t.exe不相同。
3,编译系统本身故障。
编译菜单呈灰色,无法编译,按下ctl+alt+del三个键,在任务工作区,强制关闭VC,重新启动。
错误提示:略改正方法:按照正确的流程创建C语言源程序文件。
2)宏定义错误:引发语法错误错误原因:1,位置错误,宏定义错误放入函数内部;应在所有函数的前面。
错误提示:解析:遇到define,标志符出现错误,没有定义。
与函数体的语句定义格式不符。
2,缺少宏定义标志符“#”;错误提示:define pi 3.1415927解析:引起三个错误。
3,宏定义后面多加了分号“;”,误认为是语句;错误提示:语句,定义#define pi 3.1415927; 使用宏定义area=2*pi*banjing*banjing;解析:非法间接使用。
4,宏定义中库函数名错误:如sdtil.h, maths.h等错误提示:解析:不能打开stido.h文件,单引号中标志符’stido.h’错误。
5,宏定义中库函数引用标志错误:应使用一对尖括号或一对双引号<>或”“,不用函数标志圆括号( )错误提示:解析:#include中单引号中左圆括号‘(’使用错误,两函数没有定义。
C语言常见错误分析C语言是一门非常强大和灵活的编程语言。
然而,由于人为的错误或者语法错误,程序在编译或者运行的过程中常常会出现错误。
下面是常见的C语言错误以及它们的分析。
1.语法错误:语法错误是最常见的错误类型,也是最容易修复的错误。
它们包括缺少分号、括号不匹配、使用未定义的变量等。
这些错误通常会导致编译器的语法错误提示。
2.类型错误:类型错误是由于变量类型不匹配或者操作符错误而引起的。
例如,使用一个整数变量来存储浮点数值,或者将一个指针赋值给一个非指针类型的变量。
这些错误可能导致错误的计算结果或者报错。
3.逻辑错误:逻辑错误是程序的逻辑结构有误,导致程序无法正确执行。
这种错误通常不能通过编译器检测出来,而需要开发人员通过调试来找到并修复。
例如,程序的循环条件错误导致无限循环,或者条件判断错误导致程序走入错误的分支。
4.数组越界错误:数组越界错误是指访问数组时超出了数组的有效范围。
这种错误通常导致程序崩溃或者产生不可预测的结果。
例如,访问数组元素时使用了一个超过数组长度的下标。
为了避免这种错误,开发人员应该始终确保数组下标在有效范围内。
5.空指针错误:空指针错误是指使用了一个未初始化或者已经释放的指针。
这种错误通常导致程序崩溃或者产生不可预测的结果。
为了避免空指针错误,开发人员应该在使用指针之前初始化,并且在使用完毕后及时释放。
6.内存泄漏:内存泄漏是指程序在分配内存之后没有释放,导致系统中的可用内存越来越少。
如果内存泄漏严重,最终可能会导致程序崩溃或者系统变慢。
为了避免内存泄漏,开发人员应该始终确保在不再需要内存时及时释放。
7.死循环:死循环是指程序中的循环条件永远为真,导致程序陷入无限循环。
这种情况可能导致程序无法继续执行后续代码或者崩溃。
为了避免死循环,开发人员应该在循环中始终更新循环条件。
8.未处理的异常:异常是程序运行过程中可能发生的错误,它可能导致程序崩溃或者产生不可预测的结果。
为了避免未处理的异常,开发人员应该使用异常处理机制来捕获和处理异常。
C语言程序设计中的常见错误和解决在C语言程序设计中,很多初学者经常会遇到一些常见的错误。
这些错误可能是语法错误、逻辑错误或者是其他一些常见问题导致的。
本文将介绍一些经常出现的C语言程序设计错误,并提供相应的解决方法,帮助读者更好地理解和掌握C语言编程。
一、语法错误1. 括号未匹配括号未匹配是C语言中常见的语法错误之一。
在编写代码时,经常会使用到括号,如if语句、for循环等。
如果不小心忘记关闭某个括号,就会导致括号未匹配的错误。
解决方法:仔细检查代码中的括号是否匹配,并确保每个左括号都有相应的右括号。
2. 分号丢失分号丢失是C语言中另一个常见的语法错误。
在C语言中,分号用于分隔语句,如果遗漏了分号,编译器就无法识别出语句的结束。
解决方法:检查每一行语句的末尾,确保每个语句都以分号结尾。
3. 变量未声明在使用变量之前,必须先声明该变量。
如果没有先声明变量就直接使用,编译器将无法识别该变量,从而报错。
解决方法:在使用变量之前,先进行变量声明。
二、逻辑错误1. 循环控制条件错误在编写循环语句时,控制条件的错误是常见的逻辑错误。
如果循环的控制条件错误,循环可能无法正常结束或者根本无法执行。
解决方法:仔细检查循环的控制条件,确保条件符合预期,并在循环体内更新循环变量。
2. 数组越界访问在C语言中,数组的索引从0开始,通过索引访问数组元素时,如果索引超出了数组的范围,就会导致数组越界访问的错误。
解决方法:确保数组索引在正确的范围内,避免越界访问。
如果需要遍历数组,可以使用循环来控制数组的访问范围。
三、其他常见问题及解决方法1. 变量类型不匹配在赋值操作或者表达式计算时,如果不同类型的变量之间进行操作,则会导致变量类型不匹配的错误。
解决方法:确保操作的变量类型相同或者进行强制类型转换,以保证变量类型的匹配。
2. 内存泄漏在C语言中,手动分配内存的操作是常见的。
如果分配了内存空间,但在使用完毕后未及时释放,就会导致内存泄漏。
易错点C语言中易犯的错误对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误.看着有错的程序,不知该如何改起,一些C编程时常犯的错误,写给各位学员以供参考.******************************** ******************************** ************************1.书写标识符时,忽略了大小写字母的区别.main(){int a=5;printf("%d",A);}编译程序把a和A认为是两个不同的变量名,而显示出错信息.C认为大写字母和小写字母是两个不同的字符.习惯上,符号常量名用大写,变量名用小写表示,以增加可读性.******************************** ******************************** ************************2.忽略了变量的类型,进行了不合法的运算.main(){float a,b;printf("%d",a%b);}%是求余运算,得到a/b的整余数.整型变量a和b可以进行求余运算,而实型变量则不允许进行"求余"运算.******************************** ******************************** ************************3.将字符常量与字符串常量混淆.char c;c="a";在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列.C规定以"\"作字符串结束标志,它是由系统自动加上的,所以字符串"a"实际上包含两个字符:'a'和'\',而把它赋给一个字符变量是不行的.******************************** ******************************** ************************4.忽略了"="与"=="的区别.在许多高级语言中,用"="符号作为关系运算符"等于".如在BASIC程序中可以写if (a=3) then …但C语言中,"="是赋值运算符,"=="是关系运算符.如:if (a==3) a=b;前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a.由于习惯问题,初学者往往会犯这样的错误.******************************** ******************************** ************************5.忘记加分号.分号是C语句中不可缺少的一部分,语句末尾必须有分号.a=1b=2编译时,编译程序在"a=1"后面没发现分号,就把下一行"b=2"也作为上一行语句的一部分,这就会出现语法错误.改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号.{z=x+y;t=z/100;printf("%f",t);}对于复合语句来说,最后一个语句中最后的分号不能忽略不写******************************** ******************************** ************************6.多加分号.对于一个复合语句,如:{z=x+y; t=z/100;printf("%f",t);};复合语句的花括号后不应再加分号,否则将会画蛇添足.又如:if (a%3==0);I++;本是如果3整除a,则I加1.但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1.再如:for (I=0;I<5;I++);{scanf("%d",&x);printf("%d",x);}本意是先后输入5个数,每输入一个数后再将它输出.由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它.****************************************************************************************7.输入变量时忘记加地址运算符"&".int a,b;scanf("%d%d",a,b);这是不合法的.Scanf函数的作用是:按照a,b在内存的地址将a,b的值存进去."&a"指a在内存中的地址.******************************** ******************************** ************************8.输入数据的方式与要求不符.①scanf("%d%d",&a,&b);输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:3,4输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab.②scanf("%d,%d",&a,&b);C规定:如果在"格式控制"字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符.下面输入是合法的:3,4此时不用逗号而用空格或其它字符是不对的.3 43:4又如:scanf("a=%d,b=%d",&a,&b); 输入应如以下形式:a=3,b=4****************************************************************************************9.输入字符的格式与要求不一致.在用"%c"格式输入字符时,"空格字符"和"转义字符"都作为有效字符输入.scanf("%c%c%c",&c1,&c2,&c3);如输入a b c字符"a"送给c1,字符" "送给c2,字符"b"送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔.****************************************************************************************10.输入输出的数据类型与所用格式说明符不一致.例如,a已定义为整型,b定义为实型a=3;b=4.5;printf("%f%d\n",a,b);编译时不给出出错信息,但运行结果将与原意不符.这种错误尤其需要注意.****************************************************************************************11.输入数据时,企图规定精度.scanf("%7.2f",&a);这样做是不合法的,输入数据时不能规定精度.****************************************************************************************12.switch语句中漏写break语句.例如:根据考试成绩的等级打印出百分制数段.switch(grade){ case 'A':printf("85~100\n"); case 'B':printf("70~84\n");case 'C':printf("60~69\n");case 'D':printf("<60\n"); default:printf("error\n");由于漏写了break语句,case只起标号的作用,而不起判断作用.因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二,三,四,五个printf函数语句.正确写法应在每个分支后再加上"break;".例如case 'C':printf("60~69\n");break; ****************************************************************************************13.忽视了while和do-while语句在细节上的区别.(1)main(){int a=0,I;scanf("%d",&I); while(I<=10){a=a+I;I++;}printf("%d",a);}(2)main(){int a=0,I;scanf("%d",&I);do{a=a+I;I++;}while(I<=10);printf("%d",a);}可以看到,当输入I的值小于或等于10时,二者得到的结果相同.而当I>10时,二者结果就不同了.因为while循环是先判断后执行,而do-while循环是先执行后判断.对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体.******************************** ******************************************************** 14.定义数组时误用变量. int n; scanf("%d",&n); int a[n]; 数组名后用方括号括起来的是常量表达式,可以包括常量和符号常 量.即C 不允许对数组的大小作动态定义. **************************************************************************************** 15.在定义数组时,将定义的"元素个数"误认为是可使的最大下 标值. main() {static int a[10]={1,2,3,4,5,6,7,8,9,10}; printf("%d",a[10]); } C 语言规定:定义时用a[10],表示a 数组有10个元素.其下标值由0 开始,所以数组元素a[10]是不存在的. **************************************************************************************** 16.初始化数组时,未使用静态存储. int a[3]={0,1,2}; 这样初始化数组是不对的.C 语言规定只有静态存储(static)数组 和外部存储 (exterm)数组才能初始化.应改为: static int a[3]={0,1,2}; **************************************************************************************** 17.在不应加地址运算符&的位置加了地址运算符. scanf("%s",&str); C 语言编译系统对数组名的处理是:数组名代表该数组的起始地址 ,且scanf 函数中的输入项是字符数组名,不必要再加地址符&.应 改为:scanf("%s",str); **************************************************************************************** 18.同时定义了形参和函数中的局部变量. int max(x,y) int x,y,z; {z=x>y?x:y; return(z); } 形参应该在函数体外定义,而局部变量应该在函数体内定义.应改 为: int max(x,y)int x,y;{int z;z=x>y?x:y;return(z);}试题一一、单项选择题(共30分,每题1分)1. 下列不正确的转义字符是A.\\B.\‘ C.074 D.\02. 不是C语言提供的合法关键字是A.switchB.cherC.caseD.default3.正确的标识符是()A.?a B.a=2 C.a.3 D.a_34.下列字符中属于键盘符号的是A.\ B.\n C.\t D.\b.下列数据中属于“字符串常量”的A.ABC B.“ABC” C.‘ABC’ D.‘A’6.char型常量在内存中存放的是A.ASCII码B.BCD码C.内码值D.十进制代码值7.设a为5,执行下列语句后,b 的值不为2的是()A.b=a/2B.b=6-(——a) C.b=a%2 D.b=a>3?2:28.在以下一组运算符中,优先级最高的运算符是()A.<= B.= C.% D.& &9.设整型变量i的值为3,则计算表达式i——i后表达式的值是()A.0B.1C. 2D.表达式出错10.设整型变量a,b,c均为2,表达式a+++b+++c++的结果是()A.6B.9C.8D.表达式出错11.若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是()A.1B.2C.2.0D.2.512.设a=1,b=2,c=3,d=4,则表达式:a<b?a:c<d?a:d的结果是()A.4B.3C.2D.113.设a为整型变量,不能正确表达数学关系:10<a<15的C语言表达式是()A.10<a<15B.a==11 || a= =12 || a= =13 || a= =14C.a>10&&a<15D.!(a<=10)&&!(a>=15)14.若有以下定义:char a、 intb 、 floatc 、 double d,则表达式a*b+d-c值的类型为()A.floatB.intC.charD.double15.表达式“10!=9”的值是()A.trueB.非零值 C.0 D.116.循环语句 for (x=0,y=0;(y!=123)|| (x<4);x++);的循环执行()A.无限次B.不确定次 C.4次 D.3次17.在C语言中,下列说法中正确的是()A. 不能使用“do while”的循环B.“do while”的循环必须使用break语句退出循环C.“do while”的循环中,当条件为非0时将结束循环D.“do while”的循环中,当条件为0时将结束循环。
C语言技术中的常见代码错误解析在学习和使用C语言时,我们经常会遇到各种各样的代码错误。
这些错误可能会导致程序无法正常运行,甚至崩溃。
本文将对C语言技术中的一些常见代码错误进行解析,帮助读者更好地理解和避免这些错误。
1. 语法错误语法错误是最常见的错误之一,它们通常是由于拼写错误、缺少分号或括号不匹配等问题引起的。
例如,下面的代码中缺少了一个分号:```cint a = 10```这个错误可以通过简单地在行尾添加一个分号来修复。
2. 数组越界错误数组越界错误是指访问数组时超出了数组的边界。
例如,如果一个数组有10个元素,但是我们试图访问第11个元素,就会发生数组越界错误。
这种错误可能导致程序崩溃或产生不可预测的结果。
为了避免数组越界错误,我们应该始终确保我们的数组索引在合法的范围内。
可以使用条件语句或循环来检查数组索引是否越界。
3. 空指针错误空指针错误是指试图访问空指针所引用的内存位置。
当我们声明一个指针变量但没有为其分配内存时,它的值将为NULL。
如果我们试图通过一个空指针来访问内存,就会发生空指针错误。
为了避免空指针错误,我们应该始终在使用指针之前为其分配内存,并在使用指针之后及时释放内存。
4. 逻辑错误逻辑错误是指程序中的错误逻辑或错误的算法。
这种错误可能导致程序的输出不正确或产生意外的结果。
例如,如果我们在一个循环中使用错误的条件,循环可能永远不会结束,或者我们可能会得到错误的结果。
为了避免逻辑错误,我们应该仔细检查我们的代码逻辑,并确保它符合我们的预期。
5. 内存泄漏内存泄漏是指在程序中分配了内存但没有及时释放。
如果我们反复分配内存而没有释放,最终会导致内存耗尽,从而使程序崩溃。
为了避免内存泄漏,我们应该始终在使用完内存后及时释放它。
可以使用free()函数来释放动态分配的内存。
6. 类型错误类型错误是指将一个变量赋给错误的数据类型,或者试图对不兼容的数据类型进行操作。
例如,将一个整数赋给一个字符变量,或者试图对一个字符串进行算术运算。
C语⾔常见错误分析C语⾔常见错误分析:错误分类:语法错、逻辑错、运⾏错。
0.忘记定义变量:main(){x=3;y=6;printf(“%d\n”,x+y);1.C语⾔的变量⼀定要先定义才能使⽤;2.输⼊输出的数据的类型与所⽤格式说明符不⼀致int a=3;float b=4.5;printf(“%f%d\n”,a,b);它们并不是按照赋值的规则进⾏转换(如把4.5转换为4),⽽是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后两个字节的数据按%d,作为整数输出) 3.未注意int型数据的数值范围int型数据的数值范围(-32768~32768)int num=89101;printf(“%d”,num);会将超过低16位的数截去从⽽得到23563注意:定义了long型,⽽在输出时仍⽤”%d”说明符,仍会出现以上错误4.输⼊变量时忘记使⽤地址符scanf(“%d%d”,a,b);5.输⼊时数据的组织与要求不符对scanf函数中格式字符串中除了格式说明符外,对其他字符必须按原样输⼊6.误把”=“作为”等于”⽐较符“=“为附值运算符“==“为⽐较运算符7.语句后⾯漏分号{t=a;a=b;b=t}它是pascal的语法8.不该加分号的地⽅加了分号if(a>b);printf(“a is larger than b\n”);for(i=0;i<10;i++);scanf(“%d”,&x);printf(“%d\n”,x*x);}9.对应该有花括弧的复合语句,忘记加花括弧sum=0;i=1;while(i<=100)sum=sum+1;i++;10.括弧不配对while((c=getchar()!=‘#’)putchar(c);11.在⽤标识时,忘记了⼤写字母和⼩写字母的区别{int a,b,c;a=2;b=3;C=A+B;printf(“%d+%d=%D”,A,B,C);}12.引⽤数组元素时误⽤发圆括弧{int i,a(10);for(i=0;i<10;i++)scanf(“%d”,&a(i));}13.在定义数组时,将定义的”元素个数”误认为是”可使⽤的最⼤下标值{ int a[10]={1,2,3,4,5,6,7,8,9,10};int i;for(i=1;i<=10;i++)printf(“%d”,a[i]);}14.对⼆维或多维数组的定义和引⽤的⽅法不对{int a[5,4];printf(“%d”,a[1+2,2+2]);…}15.误以为数组名代表数组中全部元素{int a[4]={1,2,3,4};printf(“%d%d%d%d”,a);}16.混淆字符数组与字符指针的区别main(){char str[40];str=“Computer and c”;printf(“%s\n”,str);}17.在引⽤指针变量之前没有对它赋予确定的值{ char *p;scanf(“%s”,p);}{char *p,c[20];p=c;scanf(“%s”,p);}18.switch语句的各分⽀中漏写 break语句混淆字符和字符串的表⽰形式…char sex;sex=“M”;…19.使⽤⾃加(++)和⾃减(--)运算符时出的错误{int *p,a[5]={1,3,5,7,9};p=a;printf(“%d”,*p++);注意于*(++p)的区别;20.所调⽤的函数在调⽤语句之后才定义,⽽⼜在调⽤前未加说明main() {float x,y,z;x=3.5;y=-7.6;z=max(x,y);printf(“%f”,z);}float max(float x,float y){return (x>y?x:y);}21.误认为形参值的改变会影响实参的值swap(int x,int y){int t;t=x;x=y;y=t;}main(){int a,b;a=3;b=4;swap(a,b);printf(“%d,%d\n”,a,b);}22.函数的实参和形参类型不⼀致fun(float x,float y)main(){int a=3,b=4;c=fun(a,b);…}23.不同类的型指针混⽤{int i=3,*p1;float a=1.5,*p2;p1=&i;p2=&a;printf(“%d,%d\n”,*p1,*p2);}24.没有注意函数参数的求值顺序int i=3;prinft(“%d,%d,%d\n”,i,++i,++i);结果为5,5,4因为VC++是采取⾃右⾄左的顺序求函数的值C标准没有具体规定函数参数求值的顺序25.混淆数组名与指针变量的区别{ int i,a[5];for(i=0;i<5;i++)scanf(“%d”,a++);}{int a[5],*p;p=a;for(int i=0;i<5;i++)scanf(“%d”,p++)}{int a[5],*p;for(p=a;pscanf(“%d”,p);}26.混淆结构体类型与结构体变量的区别struct worker{long int num;char name[20];char sex;int age;};worker.num=187045;strcpy(/doc/449e33ccda38376baf1faefa.html ,”ZhangFun”);worker.sex=‘M’;worker.age=18;27.使⽤⽂件时忘记打开,⽤只读⽅式打开,却企图向该⽂件输出数据if(fp=fopen(“test”,”r”))==NULL){printf(“cannot open this file\n”);exit(0);ch=fgetc(fp);while(ch!=‘#’){ch=ch+4;fputc(ch,fp);ch=fgetc(fp);}C语⾔编程常见问题分析1.2.1 参数校验问题在C语⾔的函数中,⼀般都要对函数的参数进⾏校验,但是有些情况下不在函数内进⾏校验,⽽由调⽤者在外部校验,到底什么情况下应该在函数内进⾏校验,什么情况下不需要在函数内进⾏校验呢?下列原则可供读者参考。
C语言常见错误分析汇总1、在一个工程里出现两个main函数时3.obj : error LNK2005: _main already defined in file1.objDebug/HELLO.exe : fatal error LNK1169: one or more multiply defined symbols found 这个就是说,你的main函数重定义了。
你看看是不是你的工程里面,包含了很多个有main函数的文件?2、fatal error C1010: unexpected end of file while looking for precompiled header directive出现这个错误的原因是,工程类型建错了,应该选择win 32 console application3、拼写错误(1)#include <stido.h> //头文件拼写错了void main(){printf("doeifweofupwp");}fatal error C1083: Cannot open include file: 'stido.h': No such file or directory(2)#inculde <stdio.h>//include拼写错了void main(){printf("doeifweofupwp");}fatal error C1021: invalid preprocessor command 'inculde'(无效的预编译命令inculde)(3)#include <stdio.h>void mian() //main拼写错了{printf("doeifweofupwp");}error LNK2001: unresolved external symbol _mainDebug/HELLO.exe : fatal error LNK1120: 1 unresolved externals你用vc建了一个控制台程序,它的入口函数应该是main.4、(1)书写标识符时,忽略了大小写字母的区别。
C语言常见错误分析汇总C语言是一种广泛应用的编程语言,但由于语法相对复杂,初学者容易犯一些常见的错误。
下面将汇总一些常见的C语言错误,以便帮助初学者更好地理解和避免这些问题。
1.语法错误:C语言对语法要求非常严格,一些错误的语法表达会导致编译错误。
例如,缺少分号、括号不成对等。
2.逻辑错误:这类错误通常是代码逻辑错误,导致程序运行结果与预期不同。
例如,条件判断错误、循环错误等。
3.变量未初始化:在使用变量之前,未对其进行初始化操作会导致不确定的结果。
这种错误可能会导致程序崩溃或产生意外结果。
4.数组越界:在C语言中,数组的下标从0开始,如果使用了超出数组范围的下标,会导致越界错误。
这可能会修改其他内存空间的值,导致程序错误。
5.内存泄漏:动态分配内存后没有正确释放会导致内存泄漏。
这在长时间运行的程序中可能导致内存耗尽。
6.不匹配的数据类型:数据类型不匹配会导致计算错误或编译错误。
例如,对整型变量使用浮点数运算符,或使用未定义的数据类型。
7.空指针解引用:解引用空指针会导致程序崩溃。
在使用指针之前,一定要确保其指向有效的内存空间。
8.死循环:循环条件错误或循环体内没有正确的终止条件会导致死循环,程序无法正常退出。
9.多次释放同一块内存:多次释放同一块动态分配的内存会导致程序错误或崩溃。
10.缺少返回语句:在函数中缺少返回语句或返回语句在多个分支中没有覆盖所有情况,会导致未定义的行为。
11.使用未定义的变量:在使用变量之前,必须先定义该变量。
否则会导致编译错误。
12.逻辑短路错误:逻辑运算符中,逻辑短路原则是如果已经可以确定逻辑表达式的结果,后续的表达式不会被执行。
如果依赖于后续表达式的计算结果,会导致逻辑错误。
13.误解优先级和结合性:C语言中运算符有优先级和结合性,如果不理解运算符的优先级和结合性,会导致计算错误。
14.使用未声明的函数:在调用函数之前,必须先声明函数。
否则会导致编译错误。
15. 不正确的格式化字符串:在使用printf等函数进行格式化输出时,必须提供与格式字符串匹配的参数,否则会导致未定义的行为。
C语言常见编程错误及解决方法C语言是一种广泛应用于系统开发、嵌入式系统编程和底层软件开发的程序设计语言。
然而,即使对于有经验的开发者来说,编写C语言程序时仍然可能会遇到各种各样的错误。
本文将介绍常见的C语言编程错误,并提供解决这些错误的方法。
一、语法错误语法错误是最常见的C语言编程错误之一。
它们通常是由于开发者书写错误或遗漏必要的符号导致的。
下面是一些常见的语法错误及其解决方法:1. 缺少分号在C语言中,分号是语句结束的标志。
如果在编写语句时忘记了分号,将导致编译错误。
解决这个问题的方法是仔细检查代码并确保每个语句末尾都有分号。
2. 括号不匹配括号在C语言中用于控制运算符的优先级和函数的参数列表。
如果在编写代码时忘记了括号或者括号不匹配,将导致编译错误。
解决这个问题的方法是仔细检查代码并确保每个左括号都有一个相应的右括号。
3. 变量声明错误在C语言中,变量必须先声明后使用。
如果在使用变量之前没有声明它,将导致编译错误。
解决这个问题的方法是在使用变量之前先声明它,或者使用头文件来声明变量。
二、逻辑错误逻辑错误是在代码的执行过程中出现的错误,导致程序无法按照预期的方式运行。
下面是一些常见的逻辑错误及其解决方法:1. 数组越界在C语言中,数组的索引从0开始,访问超出数组范围的元素将导致未定义的行为。
解决这个问题的方法是确保数组索引在正确的范围内,并确保不会越界访问数组。
2. 逻辑表达式错误逻辑表达式用于控制循环和条件语句。
如果逻辑表达式的条件写错了,将导致错误的代码执行路径。
解决这个问题的方法是仔细检查逻辑表达式并确保它按照预期工作。
3. 死循环死循环是指循环条件一直为真,导致程序无法跳出循环。
解决这个问题的方法是在编写循环时确保循环条件最终会变为假,或者在循环中使用控制语句来跳出循环。
三、内存错误内存错误是指在程序中使用了未分配的内存或访问了已释放的内存。
这些错误可能导致程序崩溃或产生不确定的行为。
C语言常见错误分析
1、书写标识符时,忽略了大小写字母的区别
C语言认为大写字母和小写字母是两个不同的字符,如在编译程序过程中,系统会把a和A看做是两个不同的变量名。
习惯上,符号常量名用大写表示,变量名用小写表示,以增加程序的可读性。
2、忽略了变量的类型,进行了不合法的运算
main()
{
float a=3.4,b=0.4;
printf(“%d”,a%b);
}
%是求余运算符,得到a/b的余数。
整形变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3、将字符常量与字符串常量混淆
char c;
c=”a”;
这里就是混淆了字符常量和字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是由一对双引号括起来的字符序列。
4、忽略了“=”与“= =”的区别
C语言中,“=”是赋值运算符,“= =”是关系运算符。
例如:
if(a= =3) a=b;
前者是进行比较运算,a是否和3相等;后者表示如果a和3相等,把b的值赋给变量a。
由于习惯问题,我们往往会犯这样的错误:if(a=3) a=b; 结果a总是等于b的值,原因是条件a=3是给a赋值3,判断条件非0,总是执行a=b。
5、忘记加分号或多加分号
考试过程中应特别注意这种情况,分号是C语句中不可缺少的一部分,语句末尾必须有分号,但也不能乱加。
例如:
#include <stdio.h>
float fun(int n)
{
}
main()
{ int n;float s;
printf(“\nPlease enter N:”); scanf(“%d”,&n);
s=fun(n);
printf(“the result is : %f\n”,s);
}
这是一个函数调用,在函数首部float fun(int n)后是没有分号的。
少加或多加分号系统在编译时都会报错。
还有一种情况在系统编译时并不会报错,但是程序的执行顺序被改变了,如:
if(a%3= =0) ;
i++;
本意是如果3整除a,则i加1,但由于if(a%3= =0)后多加了分号,即if语句后为空语句,
程序将无条件执行i++语句,不论3是否整除a,i都将自动加1。
6、输入变量时忘记加地址运算符“&”或在不应加“&”的位置加了地址运算符(1)忘记加“&”的情况,如:
int a,b;
scanf(“%d%d”,a,b);
此时,无法正确给a和b读入数据。
scanf函数的作用是:按照a、b在内存中所分配的地址将a、b的值存进去。
“&a”指a在内存中的地址,因此正确的读写格式为scanf(“%d%d”,&a,&b);
(2)多加“&”的情况。
如:
int str[];
scanf(“%s”,&str);
C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,scanf函数中的输入项是字符数组名,因此不必再加地址运算符“&”。
7、输入数据的方式与要求格式不符
例如:scanf(“%d,%d”,&a,&b);
C语言规定:如果在“格式控制”字符串中,除了格式说明以外还有其他字符,则在输入数据时应输入相同的字符。
下面输入是合法的:3,4<CR> 此时若不用逗号而用空格或其他字符是不对的,如:3 4<CR> (中间为空格) 3:4<CR> 中间为冒号
8、输入字符的格式与要求不一致
在用“%c”格式输入字符时,“空格字符”和“转义字符”都将作为有效字符输入。
例如:scanf(“%c%c%c”,&c1,&c2,&c3);
如输入:a b c<CR> 字符‘a’送给了c1,字符…‟(空格)送给了c2,字符‘b’送给了c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
9、输入输出的数据类型与所用格式说明符不一致
例如:a定义为整型,b定义为实型。
int a=3; float b=4.5;
printf(“%f%d\n”,a,b);
编译时不给出错信息提示,但运行结果将与意愿不符,这种错误尤其需要注意。
10、输入数据时,企图规定精度
scanf(“%7.2f”,&a); 上述语句是不合法的,输入数据时不能规定精度。
11、switch语句中漏写break语句
例如:根据考试成绩的等级打印出百分制分数段
switch(grade)
{ case …A‟:printf(“85 ~100\n”);
case …B‟:printf(“70 ~84\n”);
case …C‟:printf(“60 ~69\n”);
case …D‟:printf(“<60\n”);
default:printf(“error\n”);
}
由于漏写了break语句,case只起标号的作用,而不起判断的作用。
因此,当grade值为A时,printf函数在执行完第一个printf语句后接着执行后面的printf函数语句。
正确的写法应在每个分支后加上break,应改为:
switch(grade)
{ case …A‟:printf(“85 ~100\n”);break;
case …B‟:printf(“70 ~84\n”); break;
case …C‟:printf(“60 ~69\n”); break;
case …D‟:printf(“<60\n”); break;
default:printf(“error\n”);
}
12、在定义数组时,将定义的“元素个数”误认为是可使用的最大下标
例如:main()
{ static int a[10]={1,2,3,4,5,6,7,8,9,10};
printf(“%d”,a[10]);
}
C语言规定:定义时用a[10]表示数组a中有10个元素,其下标由0开始,所以数组元素a[10]是不存在的,这种错误称为“越界”。
13、自加(+ +),自减(- -)运算符的使用
自加(减)运算符只能与变量相结合,其运算规则为:自加(减)后缀形式是先引用后加(减)值;自加(减)前缀形式是先加(减)后引用。
14、if与else的匹配问题
在考试过程中若不能准确确定else与其前面哪个if相匹配时,应遵循一原则:见到else 后,要与它前面的离它最近的没有配对的那个if相匹配。
15、“/”与“\”的混淆
前者是除号,在进行相除运算时常会把“/”写成“\”,应特别注意。
16、C语言关键字的拼写
如:main—mian(错误)printf—pirntf(错误)
return—retrun(错误)while—While(错误)
17、在做改错题时要注意数字与拼音的区别
字形相似的有:0(零)与o(字母),1(数字)与l(小写字母L)等。