【超详细】解析C语言初学者常见问题与错误
c语言遇到的问题和解决方法

c语言遇到的问题和解决方法C语言是一种广泛使用的编程语言,广泛应用于系统编程、嵌入式系统、游戏开发等领域。
虽然C语言有着广泛的应用,但也存在一些常见问题和解决方法。
以下是一些常见的C语言问题及其解决方法:1. 编译错误编译错误通常是由于语法错误、变量类型错误、数组越界等引起的。
解决方法是仔细检查代码,确保语法正确,变量类型正确,数组边界正确等。
此外,可以使用C编译器提供的调试功能来查找编译错误。
2. 内存泄漏内存泄漏是指在程序运行期间,未释放的内存空间导致程序崩溃。
内存泄漏可能是由于分配的内存对象不再被使用而导致的。
解决方法是在使用内存对象时,要注意内存的分配和释放,避免不必要的内存泄漏。
3. 指针错误指针错误是由于未正确使用指针而导致的。
指针可以用来访问和修改内存中的数据,因此必须正确使用指针。
指针的类型和指向的变量必须正确声明,并且必须在正确的位置使用指针。
此外,还需要避免使用动态内存分配,因为动态内存分配可能会导致指针错误。
4. 运算符重载运算符重载是指程序能够重载算术运算、逻辑运算等基本运算符,使得它们的行为与定义不符。
运算符重载可能会导致程序出现异常,因此必须谨慎使用。
解决方法是仔细阅读C语言标准库中的函数声明,确保函数的行为符合定义。
5. 字符数组大小字符数组的大小必须正确声明并指定。
如果字符数组大小不正确,程序可能会出现字符数组越界的错误。
解决方法是在使用字符数组时,要注意数组的大小,确保数组声明的字符数组大小与变量所指向的字符数组大小相同。
以上是C语言常见问题及其解决方法的示例。
在实际编写C程序时,应该仔细审查代码,确保没有语法错误和内存泄漏等问题。
c语言常见问题及解决方法

c语言常见问题及解决方法
一、C语言常见问题及解决方法
1、程序编译错误,原因及解决方法
(1)语法错误:检查程序中出现的缩进、分号、圆括号、大括号的位置,以及程序中变量的定义,保证程序的语法正确。
(2)类型错误:检查程序中关系运算符两边操作数的类型是否匹配,以及变量的使用是否正确,保证每一步运算的类型正确。
(3)变量未声明:检查变量在程序中是否已经声明,声明后才能正确使用。
2、程序运行错误,原因及解决方法
(1)程序中存在逻辑错误:检查程序中的流程是否按设计要求正确,以及程序输出结果是否正确。
(2)程序中存在数据错误:检查程序中的数据是否正确,数据输入、输出以及运算结果都要求正确。
(3)程序运行错误:检查程序中的函数调用是否正确,注意函数的参数和返回值的类型要求。
3、程序编译成功却无法执行,原因及解决方法
这可能是程序出现了语法错误,编译器无法判断,所以编译成功,但是在执行时系统无法识别出程序的命令。
可以通过重新编写程序,查找错误语句的方式查找程序错误,并根据提示修改程序,以解决此问题。
C语言程序设计中的常见错误和解决

C语言程序设计中的常见错误和解决在C语言程序设计中,很多初学者经常会遇到一些常见的错误。
这些错误可能是语法错误、逻辑错误或者是其他一些常见问题导致的。
本文将介绍一些经常出现的C语言程序设计错误,并提供相应的解决方法,帮助读者更好地理解和掌握C语言编程。
一、语法错误1. 括号未匹配括号未匹配是C语言中常见的语法错误之一。
在编写代码时,经常会使用到括号,如if语句、for循环等。
如果不小心忘记关闭某个括号,就会导致括号未匹配的错误。
解决方法:仔细检查代码中的括号是否匹配,并确保每个左括号都有相应的右括号。
2. 分号丢失分号丢失是C语言中另一个常见的语法错误。
在C语言中,分号用于分隔语句,如果遗漏了分号,编译器就无法识别出语句的结束。
解决方法:检查每一行语句的末尾,确保每个语句都以分号结尾。
3. 变量未声明在使用变量之前,必须先声明该变量。
如果没有先声明变量就直接使用,编译器将无法识别该变量,从而报错。
解决方法:在使用变量之前,先进行变量声明。
二、逻辑错误1. 循环控制条件错误在编写循环语句时,控制条件的错误是常见的逻辑错误。
如果循环的控制条件错误,循环可能无法正常结束或者根本无法执行。
解决方法:仔细检查循环的控制条件,确保条件符合预期,并在循环体内更新循环变量。
2. 数组越界访问在C语言中,数组的索引从0开始,通过索引访问数组元素时,如果索引超出了数组的范围,就会导致数组越界访问的错误。
解决方法:确保数组索引在正确的范围内,避免越界访问。
如果需要遍历数组,可以使用循环来控制数组的访问范围。
三、其他常见问题及解决方法1. 变量类型不匹配在赋值操作或者表达式计算时,如果不同类型的变量之间进行操作,则会导致变量类型不匹配的错误。
解决方法:确保操作的变量类型相同或者进行强制类型转换,以保证变量类型的匹配。
2. 内存泄漏在C语言中,手动分配内存的操作是常见的。
如果分配了内存空间,但在使用完毕后未及时释放,就会导致内存泄漏。
C语言初学者编程的常见错误及分析

多. 编程语 言的语法规则是很严格的 , 即使 出现一
丝错 误 也 使得 整 个 程 序不 能 运行 或 运行 出错 误 的 结果 , 这 就要求 教 师在讲课 时突 出强调 语法 格 式与
种 种注 意事项 .
字 符 常量是 由一 对单 引号 括起 来 的单个 字 符 , 字 符 串常 量 是一 对 双 引号 括 起来 的字符 序 列 . C规 定 以’ \ 0 ’ 作 字符 串结 束 标 志 , 它是 由系统 自动加 上 的, 字符 串“ a ” 实 际上 包 含 两个 字 符 : ’ a ’ 和’ \ 0 ’ , 所
辑 上与题 目要求 不符 . 逻辑 错 误要 比语法 错误 难 排
引用变 量 一定 要 保证 其 值 固定 , 而 上例 中 的 a
和 b都 没有 初值 . 又如 :
i n t x, y ;
除, 往往要求用户有很扎实的基础. 经过 多 次教学 经验 的积 累 , 不 难 总结 出一 些初
中图分 类号 : T P 3 1 2
1 引 言
文献 标识 码 — 2 6 0 X( 2 0 1 3 ) 0 9 — 0 0 1 6 — 0 4 两 个不 同的 变量 名 ,从 而显 示 变量 A未定 义 这 一
作 为 一 个 长 期从 事 C语 言 教 学 的教 师 来 说 ,
错 误提示 信 息. 2 . 1 . 2 将 字 符常量 与 字符 串常量混 淆 . 如:
c h a r c ;
C= ”a I I :
经 过多 次 的教学 过 程 ,发 现初 次接 触 C语 言 的相 当一部 分 同 学入 门 比较慢 ,往往 跟 不 上老 师 的节 奏, 导 致 知识 讲 授越 多 问题堆 积 越 多 , 编 程错 误 越
C语言技术使用中的常见问题及解决方案

C语言技术使用中的常见问题及解决方案在计算机编程领域,C语言一直是一门非常重要的编程语言。
然而,由于其复杂的语法和运行环境,初学者常常会遇到各种问题。
本文将介绍一些C语言技术使用中常见的问题,并提供相应的解决方案,希望对读者有所帮助。
一、编译错误编译错误是C语言学习过程中最常见的问题之一。
当你编写的代码包含语法错误或逻辑错误时,编译器将无法正确编译你的代码,从而产生错误消息。
以下是一些常见的编译错误及其解决方案:1. 语法错误:这是最常见的编译错误之一。
语法错误通常是由拼写错误、缺少分号或括号不匹配等引起的。
要解决这个问题,仔细检查代码,确保语法正确,并修复错误。
2. 未定义的标识符:当你尝试使用未声明或未定义的变量或函数时,会出现此错误。
解决方法是确保所有标识符都已声明或定义,并且正确引用它们。
3. 类型错误:类型错误通常发生在尝试将不兼容的类型进行赋值或操作时。
要解决这个问题,确保使用正确的数据类型,并进行类型转换(如果需要)。
二、内存管理问题在C语言中,对内存的正确分配和释放是至关重要的。
不正确的内存管理可能导致内存泄漏或者悬挂指针等问题。
以下是一些常见的内存管理问题及其解决方案:1. 内存泄漏:如果你在使用完动态分配的内存后没有正确释放它,就会发生内存泄漏。
为了解决这个问题,确保在使用完内存后调用适当的释放函数(如free())来释放内存。
2. 悬挂指针:当你尝试访问已被释放的内存时,可能会出现悬挂指针问题。
为了解决这个问题,确保在释放内存后将指针设置为NULL,并在使用指针之前检查其是否为NULL。
3. 缓冲区溢出:在C语言中,没有对数组的边界进行检查,可能导致缓冲区溢出。
要避免这个问题,确保在操作数组时不要超出其边界,并使用安全的字符串函数(如strncpy())来复制字符串。
三、性能优化问题在编写C语言代码时,优化性能是一个重要的考虑因素。
以下是一些常见的性能优化问题及其解决方案:1. 循环和迭代:循环和迭代是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);}对于复合语句来说,最后一个语句中最后的分号不能忽略不写******************************** ******************************** ************************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语言是一门广泛应用于计算机科学领域的编程语言,它的简洁性和高效性使得它成为许多程序员的首选。
然而,正因为其广泛应用,C语言也存在一些常见的问题。
本文将对这些问题进行汇总,并提供相应的解决方案。
一、内存泄漏在C语言中,内存管理是程序员需要特别关注的一个方面。
内存泄漏是指程序在动态分配内存后,没有正确释放该内存,导致内存资源的浪费。
为了避免内存泄漏,程序员应该始终注意在使用完动态分配的内存后将其释放。
解决方案:使用malloc函数分配内存后,应该使用free函数释放内存。
同时,可以使用内存泄漏检测工具,如Valgrind,来帮助检测和修复内存泄漏问题。
二、空指针错误空指针错误是指程序在使用一个没有被初始化或者已经释放的指针时出现错误。
这种错误经常导致程序崩溃或者产生不可预测的结果。
解决方案:在使用指针之前,应该始终将其初始化为NULL。
在释放指针之后,应该将其赋值为NULL,以避免出现悬空指针。
此外,可以使用断言机制来检测空指针错误,例如使用assert函数来确保指针不为空。
三、数组越界访问在C语言中,数组越界访问是指对数组进行读取或写入操作时,访问了数组边界之外的内存空间。
这往往会导致程序崩溃或者产生不可预测的结果。
解决方案:在使用数组时,应该始终确保访问的索引在数组的有效范围内。
可以使用条件语句或循环来检查索引的有效性。
此外,可以使用编译器提供的警告机制来检测数组越界访问。
四、字符串操作错误在C语言中,字符串是以字符数组的形式表示的。
字符串操作错误是指在对字符串进行操作时,没有正确处理字符串的结束符'\0',导致出现不可预测的结果。
解决方案:在对字符串进行操作时,应该始终确保字符串以'\0'结尾。
可以使用标准库提供的字符串处理函数,如strcpy和strcat等,来确保字符串的正确操作。
此外,可以使用编译器提供的警告机制来检测字符串操作错误。
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语言程序在运行过程中可能会因为算法设计不合理、性能瓶颈等原因导致运行缓慢。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、if,for,while的判断后直接跟;
例如:
#include
int main(void)
{
int a;
scanf("%d",&a);
if (a == 123);////错误,if(a == 123)后面不应加上;,而应该紧跟着
8、混合输入数字和字符的杯具
#include
int main(void)
{
char ch;
int num, i;
printf("Enter a character and a integer:\n");
while((ch = getchar()) != '\n')
{
scanf("%d", &num);
puts("Thank you for using this program made by HerBal_Tea!");
system("pause");
return 0;
}
void count(void)
{
while ((ch = getchar()) != STOP)
{
if (ch = SPACE)
}
4、scanf格式控制误用
例如:
#include
int main(void)
{
float a,b,c;
printf("shuru 3 ge xi shu :");
scanf("%f,%f,%f",&a,&b,&c);
printf("he shi %f",a + b + c);
return 0;
}
解析:scanf()函数允许把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入串准确匹配。否则,例如上面的程序,那么scanf()将其解释成,将键入一个数字,键入一个逗号,然后再键入一个数字,再键入一个逗号,最后再键入一个数学。也就是说必须像这样输入:2.3,5.1,3.8。如果不能精确匹配,则scanf()读取将失败。
为了让新人们少走弯路少碰壁,我便打算写下此文。当然,由于我自己的水平也有限,其中可能自己也不知不觉犯了错误,望高手们果断斧正。
下面程序,限于篇幅,对于问题影响不大的部分我已经删去或改写,一些与相应问题无关的错误也一并进行了修改。
////{ printf();}代码
{
printf("ccc");
}
else
{
printf("ddd");
}
getchar();
return 0;
}
#include
int main(void)
{
int n,i;
printf("please input a number>2:");
scanf("%d",&n);
for(i=2;i
{
if(n%i==0)
break;
}
if(i
printf("%d not a sushu\n",n);
else
printf("%d is a sushu\n",n);
return 0;
}
解析&解决方案:见注释
3、漏头文件,main函数格式不规范
例如:
main()
{
int a;
scanf("%d",&a);
因此,要解决这个问题,最好的方法就是不要在程序中写这样的代码。
解决方案:见上。
10、60<=grade<=70
例:
if (60 <= grade <= 70)
printf("及格");
else if(70 <= grade <= 85)
printf("良好");
解析:在数学中,60<=grade<=70这种表达是成立的,但是在C语言中,并没有这种表达。
printf("input %d", a);
}Байду номын сангаас
解析:这段程序没有带上头文件stdio.h。即漏写了#include。如果仅有scanf,printf函数的话,stdio.h是可以省略并可以正确运行的,但是这是非常不好的习惯。而main()这种写法,C89标准勉强充许这种形式,C99标准是不允许的。
而void main(),至今仍未有任何标准考虑接受它。但是有些编译器的确允许。当然,这种写法广为流行,应该和老谭的书关系非常大。
解决方案:见解析
6、数据类型混淆
例如:
#include
int main(void)
{ int a;
double b=1;
for(a=1;a<=6;aA++)
b*=A;
printf("%ld",b);
}
解析:定义b为双精度浮点型,而输出使用%ld即长整型,数据类型不一致,输出为0.PS:老谭的书讲到用TC调试那一节举的例子貌似就是int a;后面写到printf("%f",a);产生错误的。
(1):在程序开头加上#include,然后在程序末尾加上system("pause");
此方法仅适用于MS-DOS,windows,不适用于*nix等系统
(2):在需要暂停的地方加入一个或两个getchar();
这种方法,实质上并不是暂停程序,而是让程序等待用户输入若干个回车。但是效果和暂停是相同的。
解决方案:吃掉输入流中的回车即可
在while循环最后,加上以下语句
while (getchar() != '\n')
continue;
也可以加上fflush(stdin);刷新输入流。
9、i++,i++;的纠结
例:
#include <stdio.h>
int main(void)
{
int i = 5;
解决方案:把b定义为长整型long,即long b = 1;(其实这里还涉及到隐式转换,所以,更为正确的方法是把a也定义为长整型)
7、C语言中的“除法”
例如:
#include
int main(void)
{
printf("请输入一个华氏温度\n");
float a,c;
scanf("%f",a);
c=5/9*(a-32);
{
printf("the Light is red,cars can't run\n"); /*判断结果为真时输出*/
}
return 0;
}
解析:在XP以上的系统用win-tc,dev-cpp等IDE编译运行此程序时,无论输入什么数字,结果都是一闪而过,因为程序执行完语句后就直接退出了。
解决方案:这里有几个办法:
{
sp_count++;
continue;
}
if (ch = ENTER)
{
n_count++;
continue;
switch(choice){
case 1.0 : printf("1.0");
break;
case 2.0 : printf("2.0");
break;
default : printf("It's not 1.0 or 2.0");
}
return 0;
}
解析:这种问题同样是不会出现在实际的编程当中。但是一些C语言题目可能会这么出。switch()接受的是整数:整型或者字符型。所以,浮点型,字符串等类型是不被switch()接受的。
for(i = 0; i < num; ++i)
putchar(ch);
putchar('\n');
printf("Enter an another pair.Empty line to quit");
}
return 0;
}
解析:这段程序表面看起来没有什么问题,但是,实际运行一遍的,就会发现,只输入了一组数据,程序就退出了。
而读取字符串是不需要加上&,因为字符串的变量名本身就代表了地址。所以例子中应为scanf("%s", str);同时,这条规则对于结构体内的变量的也适用,即
struct foo {
char ch;
char str[80];
int num
}data;
那么应该是
scanf("%c%s%d", &data.ch, data.str, &data.num);
scanf("%s", &str);
printf("Hello %s", str);
return 0;
}
解析:scanf()中,读取int, long, float, double, char等类型的数据,是需要在第n(n>=2)个参数里加上&的,因为scanf()函数里,第n(n>=2)个参数是变量的地址,而不是变量本身:例如定义int num;则scnaf("%d", &num);