C语言编译过程中的错误分析
「keilc语言编程常见错误分析」
1.Warning 280:’i’:unreferencedlocal variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告及即定义的参数在程序中并未调用2Warning 206:’Music3’:missing function-prototype 说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern voidMusic3(void),即作外部宣告3Error:318:can’t open file‘beep.h’说明在编译C:\8051\MANN.C程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h的包含档并存入到c:\8051 的工作目录中ﻫ4 Error237:’LedOn’:function already has a body ﻫ说明LedOn()函数名称重复定义即有两个以上一样的函数名称ﻫ解决方法修正其中的一个函数名称使得函数名称都是独立的ﻫﻫ5 ***WARNING16:UNCALLED SEGMENT,IGNORED FOR OVERLAYPROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if …..#endif,可保留该函数并不编译ﻫ6***WARNING6 :XDATASPACE MEMORY OVERLAPFROM : 0025HTO: 0025H ﻫ说明外部资料ROM的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XF R_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它ﻫ7 WARNING206:’DelayX1ms’:missingfunction-prototypeﻫC:\8051\INPUT.CError 267 :’DelayX1ms ‘:requires ANSI-styleprototypeC:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部8宣告可在delay.h 的包含档宣告成外部以便其它函数调用ﻫﻫ***WARNING1:UNRESOLVED EXTERNAL SYMBOLﻫSYMBOL:MUSIC3解决办法:1.是文件没有添加到工程里。
C语言编程中的常见问题与解决方案
C语言编程中的常见问题与解决方案C语言作为一门应用广泛的编程语言,在开发软件和系统方面具有重要的地位。
然而,正如其他编程语言一样,C语言编程过程中也会遇到一些常见问题。
本文将探讨一些常见问题,并提供相应的解决方案,以帮助初学者和有经验的开发者更好地应对这些问题。
问题一:语法错误C语言中最常见的问题之一就是语法错误。
这包括标点符号、括号、分号等基本语法错误,以及函数、变量的声明与使用错误等。
当出现语法错误时,编译器会给出相应的错误提示,例如指出错误的行数和错误类型。
解决方法:-仔细检查代码,确保所有的符号都配对使用,并正确使用分号。
-注意变量和函数的声明与使用,确保它们的类型和参数匹配。
-使用代码编辑器或集成开发环境(IDE),这些工具通常会在编写代码时提供实时语法检查功能,帮助避免语法错误。
问题二:逻辑错误逻辑错误是指程序在运行时没有按照预期的方式执行,即结果不符合预期。
这种错误有时很难察觉,因为它们不会引发编译错误或警告。
解决方法:-使用调试工具,例如gdb,对程序进行逐行调试以找出错误所在。
-仔细检查代码,确保逻辑正确。
可以使用流程图或伪代码来描述程序的逻辑。
-使用断言(assert)来验证代码的假设,有助于提前发现错误。
问题三:内存错误内存错误是指在使用指针时,对未分配或已释放的内存进行访问的错误。
这可能导致程序崩溃或产生不可预测的行为。
解决方法:-确认所有的指针都已正确初始化,并在使用完毕后进行适当的内存释放。
-使用动态内存分配函数(malloc、calloc和realloc)时,要确保分配的内存足够,并在使用完毕后进行释放。
-避免在指针为空时进行解引用操作,应先对指针进行空指针检查。
问题四:性能问题C语言相对底层的特性使其具备高性能的潜力,但在编写代码时也容易出现性能问题。
解决方法:-使用适当的算法和数据结构,优化代码的时间和空间复杂度。
-避免重复计算和不必要的循环。
-使用性能分析工具,例如gprof,帮助定位性能瓶颈,并进行优化。
0xc0000005 c语言
标题:探讨0xc0000005错误在C语言中的原因与解决方法一、引言在编程过程中,我们经常会遇到各种各样的错误,而0xc0000005错误无疑是其中一个令人头痛的问题。
尤其在C语言编程中,这种错误更是让人不知所措。
本文将围绕0xc0000005错误展开讨论,分析其原因,并提出解决方法,以帮助读者更好地理解和解决这一问题。
二、0xc0000005错误的原因在C语言编程中,当程序试图访问未分配的内存位置区域时,就会触发0xc0000005错误。
这种错误通常由以下几种原因引起:1.指针错误:在C语言中,指针是一个非常关键的概念。
如果在程序中使用指针时出现了错误,比如指针未初始化或指向了无效的位置区域,就有可能导致0xc0000005错误的发生。
2.内存访问越界:在C语言中,程序对数组或者其他数据结构的访问是非常常见的操作。
但是,如果程序试图访问超出数组或数据结构边界的内存位置区域,就会引发0xc0000005错误。
3.内存泄漏:内存泄漏是指程序在动态内存分配后忘记释放内存空间,导致系统资源的浪费。
当内存泄漏达到一定程度时,就有可能导致0xc0000005错误的发生。
4.使用野指针:野指针是指指针变量指向了已经释放或未分配的内存位置区域。
当程序使用野指针时,就会触发0xc0000005错误。
以上几种原因是导致0xc0000005错误的常见情况,程序员在编程时需要特别注意避免这些问题的发生。
三、解决0xc0000005错误的方法针对0xc0000005错误,我们可以采取以下一些方法来进行解决:1.检查指针使用:在程序中,特别是在涉及指针操作的代码中,务必仔细检查是否存在指针未初始化、指向无效位置区域或者野指针等问题。
可以通过打印指针的值来排查问题,或者使用调试工具进行跟踪定位。
2.加强边界检查:针对数组或者其他数据结构的访问操作,需要加强边界检查,确保程序不会访问超出边界的内存位置区域。
可以使用断言来进行边界检查,或者利用编译器的一些特性来进行静态检查。
C语言中的错误处理和异常处理技术
C语言中的错误处理和异常处理技术在C语言编程中,错误处理和异常处理是非常重要的技术。
在程序运行过程中,可能会出现各种意外情况,如输入错误、文件打开失败、内存分配失败等,处理这些异常情况可以提高程序的健壮性和可靠性。
在C语言中,有几种常见的错误处理和异常处理技术:1. 返回值检查:在调用函数时,经常会返回一个特定的值来表示函数执行的结果。
程序员可以检查返回值来判断函数是否运行成功,并据此做出相应的处理。
例如,当调用文件读写函数时,可以检查返回值是否为NULL来判断文件是否打开成功。
2. 错误码:有些函数在执行过程中会返回一个错误码,表示出现了何种错误。
程序员可以根据该错误码来分析问题所在,并采取相应的措施。
例如,标准函数库中的errno变量就是用来存储错误码的。
3. 异常处理:C语言并没有内建的异常处理机制,但可以通过setjmp和longjmp函数来实现简单的异常处理。
setjmp函数设置一个跳转点,然后程序在执行过程中发生异常时,可以使用longjmp函数跳转到之前设置的跳转点,从而实现异常处理。
4. 信号处理:在Unix/Linux系统中,程序可以通过信号处理机制来处理异常情况。
可以使用signal函数注册一个信号处理函数,当接收到相应的信号时,程序将调用该函数来处理异常。
常见的信号包括SIGSEGV(段错误)、SIGFPE(浮点异常)等。
5. 强制类型转换:有时候程序需要进行类型转换操作,但会出现类型不匹配的情况,造成编译或运行错误。
在这种情况下,程序员可以使用强制类型转换来解决问题,通过将数据强制转换为目标类型来消除警告或错误。
总的来说,良好的错误处理和异常处理是一个程序的重要组成部分,可以帮助程序更加健壮地运行。
程序员需要在编写代码的过程中考虑可能出现的各种异常情况,采取相应的措施来处理这些异常,以确保程序的稳定性和可靠性。
通过合理的错误处理和异常处理,可以提高代码的质量和可维护性,为软件开发工作带来很大的便利。
C语言程序常见错误与调试方法
1、语法错误
• 语法错误是指那些由于编程中输入不符合语法规 则产生的错误。
• 例如:表达式不完整、缺少必要的标点符号、关 键字输入错误、数据类型不匹配、循环语句或选 择语句的关键字不配对等。
• 通常,编译器对程序进行编译的过程中,会把检 测到的语法错误以提示的方式列举出来。
C Programming
C Programming
(三)C语言程序调试方法
• 总之,程序调试是一项深入细致的工作,需要下 功夫,动脑子,善于积累经验。在程序调试过程 中往往反映出一个人的水平、经验和态度。希望 大家给以足够的重视。上机调试程序的目的决不 是为了“验证程序的正确”,而是“掌握调试的 方法和技术”,要学会自己找问题,这样慢慢自 己就会写出错误较少的实用程序。
C语言程序常见错误与调试方法
(一)C语言程序常见错误
• 程序设计很少能够没有错误的一次完成,在编程 的过程中由于种种原因,总会出现这样或那样的 错误,这些程序的错误也就是常说的“Bug”, 而检测并修正这些错误就是“Debug”(调试)。
• 程序错误可分为三类:语法错误、运行错误和逻 辑错误。
C Programming
C Programming
(三)C语言程序调试方法
• 为了更有效地进行人工检查,所编的程序应力求 做到以下几点:
1)应当采用结构化程序方法编程,以增加可读性; 2)尽可能多加注释,以帮助理解每段程序的作用; 3)在编写复杂的程序时不要将全部语句都写在
main函数中,而要多利用函数,用一个函数来实 现一个单独的功能。这样便于分别检查和处理。
C Programming
(三)C语言程序调试方法
2、在人工检查无误后,再上机调试。即动态检查。 • 在编译时会给出语法错误的信息,调试时可以根
C语言编译中的常见错误
C语⾔编译中的常见错误C语⾔编译中的常见错误1、警告类错误‘XXX’declare but never used变量XXX已定义但从未⽤过。
‘XXX’is assigned a value which is never used变量XXX已赋值但从未⽤过。
Code has no effect 程序中含有没有实际作⽤的代码。
Non-portable pointer conversion不适当的指针转换,可能是在应该使⽤指针的地⽅⽤了⼀个⾮0的数值。
Possible us e of ‘XXX’before definition表达式中使⽤了未赋值的变量Possibly incorrect assignment这样的赋值可能不正确Redeclaration of ‘main’⼀个程序⽂件中主函数main不⽌⼀个。
Suspicious pointer conversion可疑的指针转换。
通常是使⽤了基本类型不匹配的指针。
Unreachable code程序含有不能执⾏到的代码。
2、错误或致命错误Compound statement missing } in function main程序结尾缺少括号}。
“}”expected;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。
Case outside of switch case不属于Switch结构,多由于switch结构中的花括号不配对所致。
Case statement missing ‘:’switch结构中的某个case之后缺少冒号。
Constant expression required定义数组时指定的数组长度不是常量表达式。
Declaration syntax error 结构体或联合类型的定义后缺少分号。
Declaration was expected 缺少说明,通常是因为缺少分界符如逗号、分号、右圆括号等所引起的。
Default outside switch Default部分放到了switch结构之外,⼀般是因为花括号不匹配⽽引起的。
C语言常见错误
对于刚学编程,刚接触C++的新手来说,编译运行报错是最头疼的一件事,爆出一堆英文,英语差一点的又不知道什么意思,所以也不知道如何去改,在此,我给大家传一份常见错误中英文对照表及简单解释,希望可以帮到大家:fatal error C1003: error count exceeds number; stopping compilation中文对照:(编译错误)错误太多,停止编译分析:修改之前的错误,再次编译fatal error C1004: unexpected end of file found中文对照:(编译错误)文件未结束分析:一个函数或者一个结构定义缺少“}”、或者在一个函数调用或表达式中括号没有配对出现、或者注释符“/*…*/”不完整等fatal error C1083: Cannot open include file: 'xxx': No such file or directory中文对照:(编译错误)无法打开头文件xxx:没有这个文件或路径分析:头文件不存在、或者头文件拼写错误、或者文件为只读fatal error C1903: unable to recover from previous error(s); stopping compilation中文对照:(编译错误)无法从之前的错误中恢复,停止编译分析:引起错误的原因很多,建议先修改之前的错误error C2001: newline in constant中文对照:(编译错误)常量中创建新行分析:字符串常量多行书写error C2006: #include expected a filename, found 'identifier'中文对照:(编译错误)#include命令中需要文件名分析:一般是头文件未用一对双引号或尖括号括起来,例如“#include stdio.h”error C2007: #define syntax中文对照:(编译错误)#define语法错误分析:例如“#define”后缺少宏名,例如“#define”error C2008: 'xxx' : unexpected in macro definition中文对照:(编译错误)宏定义时出现了意外的xxx分析:宏定义时宏名与替换串之间应有空格,例如“#define TRUE"1"”error C2009: reuse of macro formal 'identifier'中文对照:(编译错误)带参宏的形式参数重复使用分析:宏定义如有参数不能重名,例如“#define s(a,a) (a*a)”中参数a重复error C2010: 'character' : unexpected in macro formal parameter list中文对照:(编译错误)带参宏的形式参数表中出现未知字符分析:例如“#define s(r|) r*r”中参数多了一个字符‘|’error C2014: preprocessor command must start as first nonwhite space中文对照:(编译错误)预处理命令前面只允许空格分析:每一条预处理命令都应独占一行,不应出现其他非空格字符error C2015: too many characters in constant中文对照:(编译错误)常量中包含多个字符分析:字符型常量的单引号中只能有一个字符,或是以“\”开始的一个转义字符,例如“char error = 'error';”error C2017: illegal escape sequence中文对照:(编译错误)转义字符非法分析:一般是转义字符位于' ' 或" " 之外,例如“char error = ' '\n;”error C2018: unknown character '0xhh'中文对照:(编译错误)未知的字符0xhh分析:一般是输入了中文标点符号,例如“char error = 'E';”中“;”为中文标点符号error C2019: expected preprocessor directive, found 'character'中文对照:(编译错误)期待预处理命令,但有无效字符分析:一般是预处理命令的#号后误输入其他无效字符,例如“#!define TRUE 1”error C2021: expected exponent value, not 'character'中文对照:(编译错误)期待指数值,不能是字符分析:一般是浮点数的指数表示形式有误,例如123.456Eerror C2039: 'identifier1' : is not a member of 'identifier2'中文对照:(编译错误)标识符1不是标识符2的成员分析:程序错误地调用或引用结构体、共用体、类的成员error C2041: illegal digit 'x' for base 'n'中文对照:(编译错误)对于n进制来说数字x非法分析:一般是八进制或十六进制数表示错误,例如“int i = 081;”语句中数字‘8’不是八进制的基数error C2048: more than one default中文对照:(编译错误)default语句多于一个分析:switch语句中只能有一个default,删去多余的defaulterror C2050: switch expression not integral中文对照:(编译错误)switch表达式不是整型的分析:switch表达式必须是整型(或字符型),例如“switch ("a")”中表达式为字符串,这是非法的error C2051: case expression not constant中文对照:(编译错误)case表达式不是常量分析:case表达式应为常量表达式,例如“case "a"”中“"a"”为字符串,这是非法的error C2052: 'type' : illegal type for case expression中文对照:(编译错误)case表达式类型非法分析:case表达式必须是一个整型常量(包括字符型)error C2057: expected constant expression中文对照:(编译错误)期待常量表达式分析:一般是定义数组时数组长度为变量,例如“int n=10; int a[n];”中n为变量,这是非法的error C2058: constant expression is not integral中文对照:(编译错误)常量表达式不是整数分析:一般是定义数组时数组长度不是整型常量error C2059: syntax error : 'xxx'中文对照:(编译错误)‘xxx’语法错误分析:引起错误的原因很多,可能多加或少加了符号xxxerror C2064: term does not evaluate to a function中文对照:(编译错误)无法识别函数语言分析:1、函数参数有误,表达式可能不正确,例如“sqrt(s(s-a)(s-b)(s-c));”中表达式不正确2、变量与函数重名或该标识符不是函数,例如“int i,j; j=i();”中i不是函数error C2065: 'xxx' : undeclared identifier中文对照:(编译错误)未定义的标识符xxx分析:1、如果xxx为cout、cin、scanf、printf、sqrt等,则程序中包含头文件有误2、未定义变量、数组、函数原型等,注意拼写错误或区分大小写。
C语言中的错误处理机制
C语言中的错误处理机制在编程过程中,错误处理机制是非常重要的,它可以帮助我们有效地处理程序中可能出现的错误,保证程序的稳定性和可靠性。
在C语言中,错误处理主要通过返回值和错误码来实现。
首先,我们可以通过函数的返回值来判断函数执行是否成功。
通常情况下,函数执行成功时返回0,执行失败时返回非0的错误码。
这样,我们在调用函数后可以根据返回值来判断是否出现错误,并采取相应的措施。
例如,当调用malloc函数分配内存时,如果返回NULL,则表示内存分配失败,我们可以在程序中进行相应的错误处理,如释放已分配的内存或者提示用户内存分配失败。
另外,C语言还提供了一些标准的错误码,可以帮助我们更方便地进行错误处理。
比如,errno变量用来保存最近一次发生错误的错误码,我们可以通过 perror 函数来输出错误信息。
这样就可以更直观地看到程序出错的原因,有助于我们快速定位和解决问题。
除了使用返回值和错误码外,我们还可以使用C语言中的一些错误处理函数来帮助我们处理错误。
例如,通过setjmp和longjmp函数可以实现跳转式错误处理,可以在程序的任意位置跳转到事先设定的位置进行错误处理。
这种方法适用于一些特殊场景,如资源释放、异常处理等。
另外,C标准库中还提供了一些异常处理函数,如signal函数用来处理信号,当程序接收到信号时可以执行相应的处理函数。
这些函数可以帮助我们应对一些非预期的错误,保证程序的正常执行。
总的来说,C语言中的错误处理机制主要通过返回值、错误码、标准错误处理函数和信号处理函数来实现。
良好的错误处理机制不仅可以帮助我们及时发现和解决问题,还可以提高程序的鲁棒性和可靠性。
因此,在编写C语言程序时,我们应该重视错误处理机制的设计,养成良好的错误处理习惯,保证程序的稳定运行。
如何解决C语言中的编译错误与警告
如何解决C语言中的编译错误与警告C语言是一种广泛应用于系统编程和嵌入式开发的编程语言,它的编译过程中常常会出现各种错误和警告。
这些错误和警告可能会导致程序无法正确编译或者在运行时出现问题。
因此,解决C语言中的编译错误与警告是每个程序员都需要掌握的重要技能。
本文将介绍一些常见的编译错误和警告,并提供一些解决方法。
一、理解编译错误和警告的含义在解决编译错误和警告之前,我们首先需要理解它们的含义。
编译错误是指在编译过程中发现的语法错误或者逻辑错误,这些错误会导致程序无法正确编译。
编译警告是指在编译过程中发现的一些潜在的问题,虽然不会导致程序无法编译,但可能会导致程序在运行时出现问题。
二、常见的编译错误和警告1. 语法错误:语法错误是最常见的编译错误之一,它通常是由于编程人员在编写代码时遗漏了分号、括号不匹配等导致的。
解决语法错误的方法是仔细检查代码,确保语法正确。
2. 未声明的标识符:当使用一个未声明的标识符时,编译器会报错。
解决这个问题的方法是在使用标识符之前先进行声明或者引入相应的头文件。
3. 类型不匹配:类型不匹配是指在赋值或者函数调用过程中,变量的类型与期望的类型不一致。
解决这个问题的方法是检查变量的类型,并进行相应的类型转换。
4. 未使用的变量:编译器会对未使用的变量发出警告,这可能是由于代码中存在一些无用的变量。
解决这个问题的方法是删除未使用的变量或者对其进行使用。
5. 未初始化的变量:未初始化的变量可能导致程序在运行时出现未定义的行为。
解决这个问题的方法是在使用变量之前先进行初始化。
6. 函数返回值不匹配:函数的返回值类型与函数定义时声明的返回值类型不一致会导致编译错误。
解决这个问题的方法是检查函数的返回值类型,并进行相应的修改。
7. 潜在的内存泄漏:编译器可能会对未释放的内存发出警告,这可能会导致内存泄漏。
解决这个问题的方法是在使用完内存后及时释放。
三、解决编译错误和警告的方法1. 仔细阅读编译错误和警告信息:编译器通常会提供详细的错误和警告信息,我们应该仔细阅读这些信息,找出问题所在。
C语言编译、运行时常见错误
Turbo C编译、连接和运行时的常见错误&C语言编程风格一、编译时的常见错误1. 数据类型错误。
此类错误是初学者编程时的常见现象, 下面是一些要引起注意的错误:(1) 所有变量和常量必须要加以说明。
(2) 变量只能赋给相同类型的数据。
(3) 对scanf()语句, 用户可能输入错误类型的数据项, 这将导致运行时出错, 并报出错信息。
为避免这样的错误出现, 你就提示用户输入正确类型的数据。
(4) 在执行算术运算时要注意:a. 根据语法规则书写双精度数字。
要写0.5, 而不是写.5; 要写1.0,而不是1。
尽管C语言会自动地把整型转换成双精度型, 但书写双精度型是个好习惯。
让C语言为你做强行转换这是一种效率不高的程序设计风格。
这有可能导致转换产生错误。
b. 不要用0除。
这是一个灾难性的错误, 它会导致程序失败, 不管C语言的什么版本, 都是如此, 执行除法运算要特别小心。
c. 确保所有的双精度数(包括那些程序输入用的双精度数) 是在实数范围之内。
d. 所有整数必须在整数允许的范围内。
这适用于所有计算结果, 包括中间结果。
2. 将函数后面的";"忘掉。
此时错误提示色棒将停在该语句下的一行, 并显示:Statement missing ; in function <函数名>3. 给宏指令如#include, #define等语句尾加了";"号。
4. "{"和"}"、"("和")"、"/*"和"*/"不匹配。
引时色棒将位于错误所在的行, 并提示出有关丢掉括号的信息。
5. 没有用#include指令说明头文件, 错误信息提示有关该函数所使用的参数未定义。
6. 使用了Turbo C保留关键字作为标识符, 此时将提示定义了太多数据类型。
c语言遇到的问题、解决方法及结果
C语言遇到的问题、解决方法及结果1.引言C语言作为一种广泛应用的高级编程语言,常常用于开发系统软件、嵌入式软件以及数据结构等领域。
在使用C语言进行开发过程中,我们会遇到各种问题,本文将讨论常见的问题,并提供相应的解决方法及结果。
2.内存管理问题2.1内存泄漏问题描述:C语言中没有自动内存管理机制,因此在使用动态分配内存时,如果没有释放已使用的内存,就会导致内存泄漏。
解决方法:及时释放已使用的内存是避免内存泄漏的关键。
在每次动态分配内存后,务必记得使用`f re e()`函数释放内存。
结果:通过及时释放内存,可以有效避免内存泄漏问题,提高程序的内存利用效率。
2.2指针问题问题描述:由于C语言中指针的概念较为复杂,容易出现指针使用错误、野指针等问题。
解决方法:在使用指针时,需要保证指针的合法性,避免野指针问题。
同时,可以使用调试工具检查指针的值,以便及时发现和修复指针相关的问题。
结果:通过正确使用指针,可以避免指针相关的错误,提高程序的稳定性。
3.编译问题3.1编译错误问题描述:在使用C语言进行开发时,常常会遇到编译错误,如语法错误、缺少头文件等。
解决方法:仔细检查编译错误的提示信息,根据提示信息进行错误排查。
合理使用编译器提供的调试工具,例如使用`-W al l`选项开启所有警告信息,帮助发现潜在的问题。
结果:通过仔细排查编译错误并进行修复,可以确保程序的正确编译,提高开发效率。
3.2编译器兼容性问题描述:不同的编译器可能对C语言标准的支持程度不同,导致同一份代码在不同编译器下的行为不一致。
解决方法:在开发时,要考虑到目标平台使用的编译器,并根据编译器的要求进行相应的调整和优化。
可以使用条件编译等技术,在不同的编译器下使用不同的代码逻辑。
结果:通过确保程序在目标平台下编译通过,可以提高程序的可移植性和兼容性。
4.性能优化问题4.1程序运行缓慢问题描述:C语言程序在运行过程中可能会因为算法设计不合理、性能瓶颈等原因导致运行缓慢。
C语言常见错误分析
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语言技术使用中常见问题解决方案精选
C语言技术使用中常见问题解决方案精选在学习和应用C语言技术的过程中,我们常常会遇到一些问题,这些问题可能是语法错误、逻辑错误、编译错误等等。
虽然这些问题看似琐碎,但解决它们是我们提高编程能力的重要一步。
本文将为大家精选一些C语言技术使用中常见问题的解决方案,希望能够帮助读者更好地应对这些问题。
一、语法错误语法错误是编程过程中最常见的问题之一。
这些错误常常是由于拼写错误、缺少分号、括号不匹配等造成的。
在遇到这些问题时,我们可以通过仔细检查代码,查找可能的错误位置,逐个排查并修正错误。
此外,我们还可以使用一些代码编辑器或集成开发环境(IDE)来帮助我们发现并修复这些语法错误。
二、逻辑错误逻辑错误是指程序在运行过程中出现的错误,这些错误可能导致程序无法按照我们预期的方式执行。
要解决逻辑错误,我们首先需要仔细阅读程序代码,理解程序的逻辑结构。
其次,我们可以使用调试工具来帮助我们定位问题所在。
调试工具可以让我们逐行执行程序,观察变量的值以及程序的执行流程,从而找出程序中的逻辑错误。
最后,我们还可以通过添加一些输出语句来帮助我们理解程序的执行过程,从而更好地定位问题。
三、编译错误编译错误是指在编译程序时出现的错误,这些错误通常是由于语法错误或链接错误导致的。
要解决编译错误,我们首先需要仔细阅读编译器的错误提示信息,了解错误的具体原因。
其次,我们可以使用一些调试工具或IDE来帮助我们定位问题所在。
这些工具可以提供更详细的错误信息,帮助我们更好地理解错误的原因。
最后,我们还可以通过注释掉部分代码,逐步编译程序,找出导致编译错误的具体代码片段。
四、内存泄漏内存泄漏是指程序运行过程中未能正确释放已分配的内存,导致内存资源的浪费。
要解决内存泄漏问题,我们可以使用一些内存管理工具来帮助我们检测和修复内存泄漏。
这些工具可以跟踪程序中的内存分配和释放操作,帮助我们找出未释放的内存块。
此外,我们还可以在程序中添加适当的释放内存的代码,确保程序在不再需要内存时能够正确释放。
C语言中的代码调试与错误定位技巧
C语言中的代码调试与错误定位技巧在软件开发过程中,调试是解决问题的关键步骤之一。
无论经验丰富与否,开发人员在编写C语言代码时都难免会出现错误。
本文将介绍一些常用的C语言代码调试和错误定位技巧,以帮助开发人员更高效地发现和解决问题。
1. 使用错误提示信息C语言编译器通常会生成详细的错误和警告信息,这些信息能够非常有助于定位问题所在。
在编译过程中,仔细阅读编译器输出并查找错误提示是一种常见的错误定位技巧。
例如,编译器可能指出代码中缺少某个头文件或函数未定义等问题,这些提示都可以帮助我们快速定位和解决错误。
2. 使用调试器调试器是一种有助于开发人员检查程序运行过程中的问题的强大工具。
使用调试器可以逐行执行代码,并观察代码的变量和状态。
调试器还提供了设置断点、跟踪调用栈等功能,这些都有助于定位代码中的错误。
在实际调试过程中,开发人员可以通过观察变量值和执行步骤来判断代码运行是否符合预期,并可根据需要修改程序逻辑。
3. 打印调试信息在代码中添加打印语句是一种简单但有效的调试技巧。
通过在关键位置输出变量值或其他调试信息,我们可以了解代码当前的状态,从而更好地理解程序运行中的问题。
然而,为了避免在发布版本中留下冗余的打印语句,我们可以使用预处理器指令来控制调试信息的输出。
例如,可以定义一个DEBUG宏,在调试时将它设置为打印调试信息的状态,在发布版本中将其关闭,这样可以方便地控制打印语句的输出。
4. 缩小错误范围当我们发现代码中存在错误时,我们可以从以下几个方面来缩小错误的范围。
首先,检查代码是否遵循C语言的语法规范,例如括号的匹配、分号的使用等。
其次,查找最近修改的代码部分,这通常是导致错误的原因所在。
再次,检查相关的函数调用和变量赋值,以确保它们的正确性。
最后,通过注释或临时删除部分代码来确定问题是否出现在特定代码块中。
5. 使用断言断言是一种用于检查假设是否成立的方法。
在C语言中,我们可以使用断言来检查代码是否满足预期条件。
c语言中经常遇到的问题
c语言中经常遇到的问题在C语言中,有一些常见的问题可能会困扰许多初学者。
在本文中,我将介绍几个经常出现问题的情况,并提供相应的解决方案。
1. 编译错误编译错误是C语言中常见的问题。
它们通常是由于语法错误、函数或变量未定义、拼写错误等导致的。
为了解决这个问题,您可以仔细检查代码,确保所有的拼写都正确,函数和变量都已定义,并且语法是正确的。
另外,使用编译器提供的错误信息来定位问题所在,这将帮助您更快地解决编译错误。
2. 逻辑错误逻辑错误是编程过程中另一个常见的问题。
这类错误在程序编译和运行时都不会出现错误,但程序的输出结果可能与预期不符。
要解决逻辑错误,您可以使用调试工具,例如在代码中插入调试语句、使用断点等。
通过逐步执行代码并检查变量的值,您可以找到导致逻辑错误的地方,并修复它们。
3. 内存泄漏内存泄漏是指程序在分配内存后,未释放已使用的内存空间。
这会导致程序占用过多的内存,并最终导致程序崩溃。
要解决内存泄漏问题,您需要确保在使用完内存后,通过调用"free"函数来释放内存空间。
此外,您还可以使用内存调试工具来检测和解决内存泄漏问题。
4. 数组越界在C语言中,数组越界错误是一种常见的错误。
当我们尝试访问数组中不存在的索引位置时,会导致程序出现异常或崩溃。
为了避免数组越界错误,您需要确保在访问数组元素之前检查数组索引的有效性,并确保不超过数组的边界。
5. 垃圾值垃圾值是指在变量声明后,未初始化或未赋予有效值的情况下,变量中存在的未知值。
为了解决垃圾值问题,您应该始终在声明变量后,给其一个有效的初值。
这样可以避免使用未定义的变量值造成的程序错误。
在C语言中经常遇到的问题包括编译错误、逻辑错误、内存泄漏、数组越界和垃圾值。
通过仔细检查代码、使用调试工具,以及遵循良好的编程实践,您可以解决这些问题并提高程序的质量。
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语言是一门非常重要的编程语言,但是在学习和使用过程中,常常会遇到一些错误。
这些错误可能会导致程序无法正常运行或产生错误的结果。
在这篇文章中,我将介绍一些C语言常见错误及解决方法,希望对你在学习和使用C语言时能有所帮助。
1.语法错误语法错误是最常见的错误之一,它通常是由错别字、缺少分号、括号不匹配等导致的。
解决这类错误的方法是仔细检查代码,并根据编译器的错误提示进行修改。
2.类型错误类型错误指的是错误地使用了不匹配的数据类型。
比如将整数型赋值给浮点型变量,或者将字符型变量赋值给整型变量等。
解决这类错误的方法是确保变量的数据类型匹配,并进行必要的类型转换。
3.空指针错误空指针错误是指使用了未初始化或已被释放的指针变量。
当你尝试使用这些指针变量时,会导致程序崩溃或产生不可预测的结果。
解决这类错误的方法是在使用指针之前,为其分配内存空间并进行初始化。
4.内存泄漏内存泄漏是指在程序运行过程中,分配的内存空间没有被正确释放。
这会导致内存占用越来越多,最终导致程序崩溃或系统资源不足。
解决这类错误的方法是在不再需要使用一些内存空间时,使用free(函数释放它。
5.数组越界数组越界是指访问数组时超过了其允许的范围。
这会导致程序崩溃或产生不可预测的结果。
解决这类错误的方法是确保数组的索引在有效范围内,并正确使用循环等控制结构。
6.逻辑错误逻辑错误是指程序的逻辑顺序有误,导致程序无法达到预期的目标。
解决这类错误的方法是仔细分析程序的逻辑流程,并进行必要的修改和调试。
7.死循环死循环是指程序进入一个无法正常退出的循环。
这可能是由于循环条件错误或循环体内没有设置循环终止条件所导致的。
解决这类错误的方法是确保循环条件正确,同时在必要的情况下添加循环终止条件。
8.文件操作错误在进行文件操作时,可能会发生文件打开失败、读写错误等问题。
解决这类错误的方法是检查文件路径是否正确、文件是否存在以及对文件的读写权限等,并根据具体情况进行调整。
C语言常见错误及解决方法
C语言常见错误及解决方法C语言是一种广泛应用的编程语言,具有高效性和可移植性等特点。
然而,由于C语言对细节的要求较高,很容易出现各种错误。
本文将介绍C语言常见的错误及解决方法。
1.语法错误语法错误是最常见也是最容易发现的错误。
它们通常是由于拼写错误、错误的标点使用或缺少必要的符号而引起的。
解决方法是仔细检查代码,并使用编译器提供的错误信息作为参考。
2.语义错误语义错误是指代码逻辑上的错误,导致程序在运行时产生意外的结果。
这些错误通常是由于错误的条件判断、错误的变量使用或错误的控制流等引起的。
解决方法是通过仔细分析代码,检查可能的逻辑错误。
3.数组越界错误数组越界错误是指访问数组时,超出了数组的界限。
这种错误可能会导致程序崩溃或产生错误的结果。
解决方法是仔细检查数组访问的边界条件,确保索引值在合法范围内。
4.空指针错误空指针错误是指使用未初始化的指针或将指针赋值为空指针,并尝试对其进行操作。
这种错误可能会导致程序崩溃或产生未定义的行为。
解决方法是在使用指针之前,始终初始化指针,并检查指针是否为空。
5.内存泄漏内存泄漏是指程序在分配内存后,未正确释放该内存造成的。
这种错误可能会导致程序占用大量内存,并最终导致系统资源的枯竭。
解决方法是在动态内存分配之后,始终使用free函数释放相关内存。
6.死循环死循环是指程序中出现无法结束的循环结构,导致程序无法继续执行下去。
这种错误通常是由于循环条件错误或循环体中没有跳出循环的语句造成的。
解决方法是仔细检查循环条件,并在循环体中使用终止循环的语句。
7.逻辑错误逻辑错误是指代码的逻辑顺序或条件判断错误,导致程序无法按照预期方式执行。
这种错误通常是由于逻辑表达式的错误或错误的计算顺序引起的。
解决方法是通过仔细分析代码,检查逻辑错误的可能性。
8.类型错误类型错误是指将不兼容的数据类型进行操作或赋值,导致程序产生意外的结果。
这种错误可能会导致数据截断、计算错误或未定义的行为。
C语言编译错误信息
C语言编译错误信息Turbo C 编译程序检查源程序中三类出错信息:致命错误、一般错误和警告。
致命错误出现很少,它通常是内部编译出错。
在发生致命错误时,编译立即停止,必须采取一些适当的措施并重新编译。
一般错误指程序的语法错误、磁盘或内存存取错误或命令错误等。
编译系统遇到这类错误时,一般也要停止编译。
警告并不阻止编译进行。
它指出一些值得怀疑的情况,而这些情况本身又有可能合理地成为源程序的一部分。
因此,警告信息只是提醒用户注意,编译过程并不停止。
编译系统在发现源程序中的各类错误时,首先显示错误信息,然后显示源文件名和出错的行号。
但必须注意,真正的错误位置不一定准在显示出错的行上,也可能是在前一行或前几行;有时,好象发生了很多错误,而实际上可能是由一个错误造成的。
下面按字母顺序分别列出这三类错误信息。
对每一条信息,提供可能产生的原因和修正的方法。
致命错误1.Bad call of in-lint function内部函数非法调用在使用一个宏定义的内部函数时,没有正确调用。
一个内部函数以双下划线(--)开始和结束。
2.Irreducible expression tree 不可约表达式树这种错误是由于源文件中的某些表达式使得代码生成程序无法为它产生代码。
这种表达式必须避免使用。
3. Registcr allocation failure 存储器分配失效这种错误指的是源文件行中的表达式太复杂,代码生成程序无法为它生成代码。
此时应简化这种复杂的表达式或干脆避免使用它。
一般错误1. #Operator not followed by macro argument name#运算符后无宏变量名。
在宏定义中,#用于标识一宏变量名。
“#”后必须跟一宏变量名。
2. ‘xxxxxxxx’nor an argument‘xxxxxxxx’不是函数参数。
在源程序中将该标识符定义为一个函数参数,但此标识符没有在函数表中出现。
c代码 编译报错 行数
c代码编译报错行数
当编译C代码时遇到报错,通常需要查看报错信息以及报错所
在的行数来定位问题。
编译器会输出详细的错误信息,包括错误类
型和具体位置。
常见的编译错误包括语法错误、类型错误、链接错
误等。
在查看报错信息时,需要注意报错所在的行数,这有助于快
速定位并修复问题。
在处理编译报错时,首先需要仔细阅读编译器输出的错误信息,了解报错类型和位置。
然后,根据报错信息定位到具体的代码行数,检查该行代码是否存在语法错误、拼写错误或者类型错误。
有时候
报错的位置可能并不是实际错误发生的地方,可能是之前的代码逻
辑错误导致后续报错。
另外,编译报错也可能是由于缺少头文件、链接库错误等原因
导致的,这时需要检查相关的头文件引入和链接库设置是否正确。
除了以上提到的常见情况,编译报错还可能涉及到编译器版本、编译选项、环境配置等因素。
因此,需要全面分析编译报错的原因,从多个角度寻找解决方案。
总之,处理C代码编译报错时,需要仔细阅读错误信息,定位报错的行数,全面分析可能的原因,并逐一排查和解决问题。
希望以上回答能够帮助你更好地处理C代码编译报错问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言编译过程中的错误分析语言的最大特点是:功能强、使用方便灵活。
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);}对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。
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 4 3:4又如:scanf("a=%d,b=%d",&a,&b);输入应如以下形式: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%dn",a,b);编译时不给出出错信息,但运行结果将与原意不符。
这种错误尤其需要注意。
11.输入数据时,企图规定精度。
scanf("%7.2f",&a);这样做是不合法的,输入数据时不能规定精度。
12.switch语句中漏写break语句。
例如:根据考试成绩的等级打印出百分制数段。
switch(grade){ case 'A':printf("85~100n");case 'B':printf("70~84n");case 'C':printf("60~69n");case 'D':printf("<60n");default:printf("errorn");由于漏写了break语句,case只起标号的作用,而不起判断作用。
因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。
正确写法应在每个分支后再加上“break;”。
例如case 'A':printf("85~100n");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);doI++;}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);}形参应该在函数体外定义,而局部变量应该在函数体内定义。