c语言错题集锦讲解
- 格式:doc
- 大小:221.01 KB
- 文档页数:23
c语言易错题目及其解析答:死循环是指程序进入一个无限循环的状态,无法正常结束。
造成死循环的情况可能包括以下几种:- 循环条件永远为真,如while(1)- 循环变量未被改变,导致循环一直执行同一次- 函数调用自身,形成递归调用但没有递归结束条件- 程序逻辑出现错误,导致循环无法正常退出2. 下面代码的输出结果是什么?```cint a = 1;if(a++ == 1)printf('a=%d', a);elseprintf('a=%d', ++a);```答:输出结果为a=2。
这是因为if语句中的条件表达式使用了后自增运算符,会先用变量a的值进行比较,再将a的值加1。
因此,if语句中的条件表达式为假,else语句执行,a的值先加1再输出。
3. 下面代码的输出结果是什么?```cchar str[] = 'abc';printf('%s', str);```答:输出结果为abc。
这是因为printf函数的%s格式化符号可以输出一个字符串,而在C语言中,字符数组也可以看作是一个字符串。
4. 下面代码的输出结果是什么?```cint a = 3, b = 4;printf('%d', a+b);printf('%d', 'a+b');```答:第一行输出结果为7,第二行会出现编译错误。
这是因为第二行使用了双引号将a+b括起来,使其变成了一个字符串常量,而printf函数的%d格式化符号无法输出字符串。
5. 下面代码的输出结果是什么?```cint a = 10;float b = 3.1415;printf('%f', a/b);```答:输出结果为3.183099。
这是因为当进行算术运算时,如果参与运算的类型不同,C语言会进行自动类型转换。
在这个例子中,整型的a被强制转换成了浮点型,然后与浮点型的b进行了除法运算,得到的结果为浮点型。
C语⾔错误⼤全及中⽂解释1: Ambiguous operators need parentheses — 不明确的运算需要⽤括号括起2: Ambiguous symbol xxx — 不明确的符号3: Argument list syntax error — 参数表语法错误4: Array bounds missing — 丢失数组界限符5: Array size toolarge — 数组尺⼨太⼤6: Bad character in paramenters — 参数中有不适当的字符7: Bad file name format in include directive — 包含命令中⽂件名格式不正确8: Bad ifdef directive synatax — 编译预处理ifdef有语法错9: Bad undef directive syntax — 编译预处理undef有语法错10: Bit field too large — 位字段太长11: Call of non-function — 调⽤未定义的函数12: Call to function with no prototype — 时没有函数的说明13: Cannot modify a const object — 不允许修改常量对象14: Case outside of switch — 漏掉了case 语句15: Case syntax error — Case 语法错误16: Code has no effect — 代码不可能执⾏到17: Compound statement missing{ — 分程序漏掉"{"18: Conflicting type modifiers — 不明确的类型说明符19: Constant expression required — 要求常量表达式20: Constant out of range in comparison — 在⽐较中常量超出范围21: Conversion may lose significant digits — 转换时会丢失意义的数字22: Conversion of near pointer not allowed — 不允许转换近指针23: Could not find file xxx — 找不到XXX⽂件24: Declaration missing ; — 说明缺少";"25: Declaration syntax error — 说明中出现语法错误26: Default outside of switch — Default 出现在switch语句之外27: Define directive needs an identifier — 定义编译预处理需要标识符28: Division by zero — ⽤零作除数29: Do statement must have while — Do-while语句中缺少while部分30: Enum syntax error — 语法错误31: Enumeration constant syntax error — 枚举常数语法错误32: Error directive :xxx — 错误的编译预处理命令33: Error writing output file — 写输出⽂件错误34: Expression syntax error — 表达式语法错误35: Extra parameter in call — 调⽤时出现多余错误36: File name too long — ⽂件名太长37: Function call missing ) — 缺少右括号38: Fuction definition out of place — 函数定义位置错误39: Fuction should return a value — 函数必需返回⼀个值40: Goto statement missing label — 没有标号41: Hexadecimal or octal constant too large — 或8进制常数太⼤42: Illegal character x — ⾮法字符x43: Illegal initialization — ⾮法的初始化44: Illegal octal digit — ⾮法的8进制数字 A45: Illegal pointer subtraction — ⾮法的指针相减46: Illegal structure operation — ⾮法的结构体操作47: Illegal use of floating point — ⾮法的浮点运算48: Illegal use of pointer — 指针使⽤⾮法49: Improper use of a typedefsymbol — 类型定义符号使⽤不恰当50: In-line assembly not allowed — 不允许使⽤⾏间汇编51: Incompatible storage class — 存储类别不相容52: Incompatible type conversion — 不相容的53: Incorrect number format — 错误的数据格式54: Incorrect use of default — Default使⽤不当55: Invalid indirection — ⽆效的间接运算56: Invalid pointer addition — 指针相加⽆效57: Irreducible expression tree — ⽆法执⾏的表达式运算58: Lvalue required — 需要逻辑值0或⾮0值59: Macro argument syntax error — 宏参数语法错误60: Macro expansion too long — 宏的扩展以后太长61: Mismatched number of parameters in definition — 定义中参数个数不匹配62: Misplaced break — 此处不应出现63: Misplaced continue — 此处不应出现continue语句64: Misplaced decimal point — 此处不应出现⼩数点65: Misplaced elif directive — 不应编译预处理elif66: Misplaced else — 此处不应出现else67: Misplaced else directive — 此处不应出现编译预处理else68: Misplaced endif directive — 此处不应出现编译预处理endif69: Must be addressable — 必须是可以编址的70: Must take address of memory location — 必须存储定位的地址71: No declaration for function xxx — 没有函数xxx的说明72: No stack — 缺少堆栈73: No type information — 没有类型信息74: Non-portable pointer assignment — 不可移动的指针(地址常数)赋值75: Non-portable pointer comparison — 不可移动的指针(地址常数)⽐较76: Non-portable pointer conversion — 不可移动的指针(地址常数)转换77: Not a valid expression format type — 不合法的表达式格式78: Not an allowed type — 不允许使⽤的类型79: Numeric constant too large — 数值常太⼤80: Out of memory — 内存不够⽤81: Parameter xxx is never used — 能数xxx没有⽤到82: Pointer required on left side of -> — 符号->的左边必须是指针83: Possible use of xxx before definition — 在定义之前就使⽤了xxx(警告)84: Possibly incorrect assignment — 赋值可能不正确85: Redeclaration of xxx — 重复定义了xxx86: Redefinition of xxx is not identical — xxx的两次定义不⼀致87: Register allocation failure — 寄存器定址失败88: Repeat count needs an lvalue — 重复计数需要逻辑值89: Size of structure or array not known — 结构体或数给⼤⼩不确定90: Statement missing ; — 语句后缺少";"91: Structure or union syntax error — 结构体或联合体语法错误92: Structure size too large — 结构体尺⼨太⼤93: Sub scripting missing ] — 下标缺少右⽅括号94: Superfluous & with function or array — 函数或数组中有多余的"&"95: Suspicious pointer conversion — 可疑的指针转换96: Symbol limit exceeded — 符号超限97: Too few parameters in call — 时的实参少于函数的参数不98: Too many default cases — Default太多(switch语句中⼀个)99: Too many error or warning messages — 错误或警告信息太多100: Too many type in declaration — 说明中类型太多101: Too much auto memory in function — 函数⽤到的局部存储太多102: Too much global data defined in file — ⽂件中全局数据太多103: Two consecutive dots — 两个连续的句点104: Type mismatch in parameter xxx — 参数xxx类型不匹配105: Type mismatch in redeclaration of xxx — xxx重定义的类型不匹配106: Unable to create output file xxx — ⽆法建⽴输出⽂件xxx107: Unable to open include file xxx — ⽆法打开被包含的⽂件xxx108: Unable to open input file xxx — ⽆法打开输⼊⽂件xxx109: Undefined label xxx — 没有定义的标号xxx110: Undefined structure xxx — 没有定义的结构xxx111: Undefined symbol xxx — 没有定义的符号xxx112: Unexpected end of file in comment started on line xxx — 从xxx⾏开始的注解尚未结束⽂件不能结束113: Unexpected end of file in conditional started on line xxx — 从xxx 开始的条件语句尚未结束⽂件不能结束114: Unknown assemble instruction — 未知的汇编结构115: Unknown option — 未知的操作116: Unknown preprocessor directive: xxx — 不认识的预处理命令xxx117: Unreachable code — ⽆路可达的代码118: Unterminated string or character constant — 字符串缺少引号119: User break — ⽤户强⾏中断了程序120: Void functions may not return a value — Void类型的函数不应有返回值121: Wrong number of arguments — 的参数数⽬错122: xxx not an argument — xxx不是参数123: xxx not part of structure — xxx不是结构体的⼀部分124: xxx statement missing ( — xxx语句缺少左括号125: xxx statement missing ) — xxx语句缺少右括号126: xxx statement missing ; — xxx缺少分号127: xxx declared but never used — 说明了xxx但没有使⽤128: xxx is assigned a value which is never used — 给xxx赋了值但未⽤过。
c语言题库改错题及详解答案C语言是一种广泛使用的计算机编程语言,它以其强大的功能和灵活性而闻名。
在学习和掌握C语言的过程中,练习题库中的改错题是提高编程技能的有效方式。
以下是一些常见的C语言改错题及其详解答案。
1. 题目:编写一个程序,计算并输出1到10的累加和。
错误代码:```cint main() {int sum = 0;for(int i = 1; i <= 10; i++) {sum = sum + i;}print("Sum is %d", sum);return 0;}```错误点: `print` 函数应为 `printf`。
正确代码:```c#include <stdio.h>int main() {int sum = 0;for(int i = 1; i <= 10; i++) {sum += i; // 可以简化为 sum += i;}printf("Sum is %d\n", sum);return 0;}```2. 题目:编写一个程序,判断输入的年份是否为闰年。
错误代码:```cint main() {int year;printf("Enter a year: ");scanf("%d", &year);if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {printf("%d is a leap year.\n", year);} else {printf("%d is not a leap year.\n", year);}return 0;}```错误点:逻辑判断的括号使用不正确。
正确代码:```c#include <stdio.h>int main() {int year;printf("Enter a year: ");scanf("%d", &year);if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {printf("%d is a leap year.\n", year);} else {printf("%d is not a leap year.\n", year);}return 0;}```3. 题目:编写一个程序,实现字符串的反转。
1.调试C程序时常见的错误类型分析一般情况下,错误主要分为两大类:一、语法错误。
对于这种错误,用编译器很容易解决。
所以,改错题的第一步是先编译,解决这类语法错误。
下面总结了二级C 语言上机改错题中常见的语法错误:(1)丢失分号,或分号误写成逗号。
(2)关键字拼写错误,如本来小写变成大写。
(3)语句格式错误,例如for语句中多写或者少写分号。
(4)表达式声明错误,例如:少了()(5)函数类型说明错误。
与main()函数中不一致。
(6)函数形参类型声明错误。
例如:少*等。
(7)运算符书写错误,例如:/写成了\。
二、逻辑错误,或者叫语义错误,这和实现程序功能紧密相关,一般不能用编译器发现。
对于逻辑错误可以按这样的步骤进行查找。
(1)先读试题,看清题目的功能要求。
(2)通读程序,看懂程序中算法的实现方法。
(3)细看程序,发现常见错误点。
2.改错题的改错方式总结,当然这些总结只能对大部分改错行有效。
1、若错误行是函数首部,可分为以下几种情况:A、该行最后若有分号则删除,中间若有分号则改成逗号B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m个元素的指针变量,则第二维的长度必须与main中对应数组的第二维长度相同C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return 后变量的类型一致。
2、若错误行是if或while语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。
3、若错误行中有if、while、for则要特别注意条件表达式的错误问题:A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号C、for中要用分号分隔表达式,而不是用逗号4、语法错误A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。
c语言经典易错题在学习C语言的过程中,我们经常会遇到一些经典的易错题。
这些题目看似简单,但往往会隐藏一些陷阱。
下面我将介绍一些常见的C 语言易错题,并通过详细的解析帮助大家更好地理解和掌握。
题目一:```c#include <stdio.h>int main() {int a = 5, b = 3;a = b++;printf("a=%d, b=%d\n", a, b);return 0;}```在上面的代码中,我们定义了两个变量a和b,并且使用后置递增操作符将b赋值给a。
最后通过printf函数打印出a和b的值。
请问,代码执行后a和b的值分别是多少?解析:在执行 `a = b++` 这一行代码时,先将 `b` 的值赋给 `a`,然后再将`b` 自身进行自增操作。
`b++` 的返回值是原始的 `b` 的值,在本例中即为 `3`。
所以执行完这一行代码后,`a` 的值为 `3`,`b` 的值为 `4`。
因此,最后打印出的结果是 `a=3, b=4`。
题目二:```c#include <stdio.h>int main() {int a = 5, b = 3;a = ++b;printf("a=%d, b=%d\n", a, b);return 0;}```与题目一类似,下面的这段代码中我们只是将递增操作符从后置变为前置。
请问,代码执行后a和b的值分别是多少?解析:在执行 `a = ++b` 这一行代码时,先对 `b` 进行自增操作,然后再将自增后的 `b` 的值赋给 `a`。
`++b` 的返回值就是自增后的 `b` 的值,在本例中即为 `4`。
所以执行完这一行代码后,`a` 的值为 `4`,`b` 的值也为 `4`。
因此,最后打印出的结果是 `a=4, b=4`。
题目三:```c#include <stdio.h>int main() {int a = 5, b = 3;int c = a++ + ++b;printf("a=%d, b=%d, c=%d\n", a, b, c);return 0;}```在上面的代码中,我们定义了三个变量a、b和c,并使用了后置递增和前置递增操作符。
C语言改错题分类总结计算机等级C语言上机考试改错题分类总结改错题总的出错分为两大类:语法出错和逻辑出错,此类题目是比较简单的题型,因此也是最容易把握的知识点。
注意:错误都是出现在/**********found**********/下面的这一行。
只是下面的这一行,其他行都没有错误。
不能修改其他行。
做题方法:1.首先拿到题目,先将题目详细看看,看清题目对做题时很有帮助的,特别是一些逻辑性较强的题目很有用。
有的同学可能会觉得题目太难了不想去读,其实在做改错题目时即便你不会也能把题目做对。
2.按照以下的步骤解决题目中的错误的内容,对应着修改。
修改完之后保存即可。
1.关键字出错:在二级C 语言考试中仅仅考查学生对基本的关键字掌握情况,比如:整型就是int 不是Int,知识点简单。
2.格式出错:在考试中主要考查学生细心的程度,最喜欢考简单的知识点。
(1)少分号:考查的知识点:分号是语句结束的标志。
(2)for 语句的格式:for( ; ; )中间用分号隔开不是用逗号隔开。
(3)if 语句的格式:if(表达式),if 后面必须加上小括号。
(4)命令行格式出错:如 include 命令少了#,正确的形式应该是#include “stdio.h”;(5)常用函数格式:A.函数名后面一定是花括号,不能是方括号,方括号只有在数组下标中用到。
B.要同时定义两种以上不同的数据类型的时候必须在不同类型的数据中间加上分号。
C.scanf(“%d”,a[i][j]);应该改为scanf(“%d”,&a[i][j])。
考查scanf输入函数的格式。
(6)数组:A.数组下标引用时候只能用反括号。
B.二维数组中的列下标不能省略。
(7)常用符号出错:A. C 语言中大于等于符号是“>=”,但是在考试的时候可能出现将它写为“=>”B.当题目中需要比较某个字符是否是大写字母或是小写字母、数字时,必须将“与”、“或”、“非”记住。
c语言改错题题库及详解答案C语言是一种广泛使用的计算机编程语言,它以其高效性、灵活性和强大的功能而受到程序员的青睐。
然而,即使是经验丰富的程序员也难免会在编写C语言程序时犯一些错误。
下面是一个C语言改错题题库及其详解答案,帮助学习者识别并改正常见的编程错误。
题目1:错误的变量初始化```cint main() {int a;printf("%d", a); // 错误:变量a未初始化return 0;}```详解答案:在C语言中,如果一个变量在使用前没有被显式地初始化,它的值是不确定的。
为了修复这个错误,我们应该在声明变量时对其进行初始化。
```cint main() {int a = 0; // 正确的初始化printf("%d", a);return 0;}```题目2:错误的数组索引```cint main() {int arr[5] = {1, 2, 3, 4, 5};printf("%d", arr[5]); // 错误:数组索引越界return 0;}```详解答案:数组索引是从0开始的,所以对于一个有5个元素的数组,有效的索引范围是0到4。
访问数组的第6个元素会导致越界错误。
```cint main() {int arr[5] = {1, 2, 3, 4, 5};printf("%d", arr[4]); // 正确的索引return 0;}```题目3:错误的循环使用```cint main() {int i;for (i = 0; i <= 10; i++) {printf("%d ", i);} // 错误:循环条件错误return 0;}```详解答案:循环条件应该是`i < 10`,以确保循环不会无限执行。
```cint main() {int i;for (i = 0; i < 10; i++) {printf("%d ", i);}return 0;}```题目4:错误的函数调用```cint main() {int result = add(5, 3); // 错误:add函数未定义printf("%d", result);return 0;}```详解答案:在调用一个函数之前,需要确保该函数已经被定义。
c语言改错题题库及详解答案1. 题目:以下代码段中存在错误,请找出并改正。
```c#include <stdio.h>int main() {int a = 10;int b = 20;int c = a + b;printf("The sum is %d", c);return 0;}```答案:代码中缺少了字符串结束的空格。
应改为:```cprintf("The sum is %d ", c);```2. 题目:找出并改正以下代码段中的错误。
```c#include <stdio.h>int main() {int num = 100;if (num = 100)printf("Number is 100\n");return 0;}答案:代码中使用了赋值运算符 "=" 而不是比较运算符 "=="。
应改为:```cif (num == 100)```3. 题目:以下代码段中存在逻辑错误,请指出并改正。
```c#include <stdio.h>int main() {float a, b, c;scanf("%f %f", &a, &b);c = a / b;printf("The result is %f", c);return 0;}```答案:代码中没有检查除数 b 是否为 0,这会导致运行时错误。
应添加检查:```cif (b != 0) {c = a / b;printf("The result is %f", c);} else {printf("Error: Division by zero.\n");}```4. 题目:找出并改正以下代码段中的语法错误。
当涉及到易错题时,以下是一些常见的C语言易错题及其解析:1. 下面代码的输出结果是什么?```c#include <stdio.h>int main() {int x = 5;printf("%d", x++);return 0;}```答案:该代码的输出结果是5。
这是因为`x++`是后置递增操作符,它会先使用变量的当前值,然后再将其递增。
2. 下面代码的输出结果是什么?```c#include <stdio.h>int main() {int x = 10;if (x = 5) {printf("Hello");} else {printf("World");}return 0;}```答案:该代码的输出结果是"Hello"。
这是因为在条件语句中使用了赋值操作符`=`而不是相等操作符`==`。
因此,表达式`x = 5`会将5赋值给变量x,并且由于赋值操作的结果为非零值,条件判断为真。
3. 下面代码的输出结果是什么?```c#include <stdio.h>int main() {char str[] = "Hello";printf("%c", str[5]);return 0;}```答案:该代码会导致未定义的行为。
数组下标从0开始计数,而`str`数组的长度为6(包括结尾的空字符'\0')。
因此,`str[5]`尝试访问越界的内存位置,导致未定义的行为。
这些是一些常见的C语言易错题,通过理解和注意这些概念,可以帮助避免在编写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语言易错点考点(完整版)总体上必须清楚的: 1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch) 2)用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”;源程序经编译后生成后缀名为“.obj”的目标文件;再把目标文件与各种库函数连接起来,生成“.exe”的可执行文件。
3)main函数,又称主函数,每个C程序有且只有一个main函数;无论main函数在整个程序中的位置如何,程序总是从main函数开始执行、也从main函数结束。
读程序时应从main函数开始, 然后从上往下读(碰到循环做循环,碰到选择做选择)。
4)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址. 5)bit是位是指为0 或者1。
byte 是指字节, 一个字节 = 八个位. 6)一定要记住二进制如何划成十进制。
概念常考到的:1、编译预处理不是C 语言的一部分,不占运行时间,不要加分号。
C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。
2、每个C语言程序中main函数是有且只有一个。
3、在函数定义中不可以再定义函数、即不允许函数嵌套定义。
4、算法可以没有输入,必须要有输出。
5、break可用于循环结构和switch语句。
6、逗号运算符的级别最低。
7、任意合法的表达式一定有一个数值与它对应。
第一章 1)C程序中对字母的大小写是敏感的,如A与a是不同的标识符。
注释:是对程序的说明,目的是提高程序的可读性,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,不允许嵌套注释。
3)合法的用户标识符考查:合法的要求是由字母,数字,下划线组成。
有其它元素就错了。
并且第一个必须为字母或则是下划线。
第一个为数字就错了。
关键字不可以作为用户标识符号。
main define scanf printf 都不是关键字。
c语言易错题目及其解析1.在C语言中,++i 与 i++ 的区别是什么?答:++i是先进行自增操作,再进行表达式运算;i++是先进行表达式运算,再进行自增操作。
2. 下面这段代码会输出什么?int i = 10;while (i-->0){printf('%d ',i);}答:输出9 8 7 6 5 4 3 2 1 0。
该代码利用了C语言中的后缀递减运算符--。
3. 在C语言中,如何实现字符串反转?答:可以通过循环遍历字符串,将字符串的首尾字符进行交换,直到遍历到字符串的中间位置。
4. 下面这段代码会输出什么?char *str = 'hello';printf('%d',sizeof(str));答:输出指针变量str所占的内存字节数,通常是4或8(根据编译器的位数而定),因为指针变量本身只是一个指向地址的变量。
5. 在C语言中,如何实现动态内存分配?答:可以使用标准库函数malloc()来分配内存,并使用函数free()来释放内存。
6. 下面这段代码会输出什么?int a[5] = {1,2,3,4,5};int *p = (int*)(&a+1);printf('%d,%d',*(a+1),*(p-1));答:输出2,5。
该代码利用了指针的运算规则,因为&a是指向整个数组a的指针,所以&a+1会指向a数组之后的一个未知内存地址,然后将其强制转换为int*类型的指针p,由于a数组是连续存储的,所以p-1指向的是a[4]的地址,*(p-1)就是a[4]的值。
而*(a+1)就是a[1]的值。
计算机等级考试二级C语言上机改错题考点汇总[推荐阅读]第一篇:计算机等级考试二级C语言上机改错题考点汇总计算机等级考试二级C语言上机改错题考点汇总青年人网站小编发现很多考生对上机考试存在很大的问题,现在小编将在教学当中对二级C语言上机考试题库总结的经验和大家分享,希望能对我们考生的考试有所帮助,顺利通过考试!以下是对上机考试改错题的做题方法和总结,改错题的错误主要分为以下几类:1、if或while语句若错误行是if或者while语句,则要注意以下点:1)首先判断是否正确书写if或while关键字;2)然后看有没有用小括号把整个表达式括起来,若没有则加上小括号;3)若条件表达式中有指针变量而且没有指针运算符时,则加上指针运算符;4)若if条件表达式中只有一个等于号即数学等号(=),则要改写成两个等于号即逻辑等号(= =);5)若if条件表达式为其他的比较运算符,则一般是进行逆转或加一个等于号;2、for语句若错误行是for语句,则要注意以下几点:1)首先判断for有没有书写正确;2)然后看for中的表达式是不是用分号(;)隔开,若不是则改为分号。
记住是分号(;),不是逗号(,)!3)再者,分析for中的三个表达式,是否符合题意;第一个表达式表示起始条件,第二个表达式表示终止条件,第三个表达式表示循环变量的变化。
3、return语句若错误行为return语句,则要注意以下几点:1)首先看是不是正确书写return关键字;2)然后看是不是缺少分号,若是则加上分号即可;3)再者判断return后的变量或表达式是否正确;这种错误需要根据题意来分析,分析返回变量或表达式的值和类型。
4、赋值语句若错误行是赋值语句,则要看赋值是否正确,然后看赋值运算符是否写正确。
5、定义语句若错误行是定义语句,则要注意:1)首先分析变量类型名是否写对;2)然后分析给变量赋初值是否正确;3)若以上均不是,则看是不是少定义了某个变量或少了花括号; 第二篇:二级C语言上机考试改错题总结二级C语言上机考试改错题总结根据本人多年研究全国计算机等级考试二级若错误行中有整数1除以某个表达式或变量时,必C语言,发现很多考生对上机考试存在很大的问须把整数1改为1.0;若变量或表达式是整型时,题。
C语言易错题集及易忘知识1.下面的程序运行后输出为【】。
main( ){ int a=-32769;ptintf("%8U\\n",a);}A) 32769 B) %8U C) 32767 D) -32767分析:格式字符必须小写,题中的"%8U"不会当作格式控制符,而是原样输出,变量a 将没有对应的格式说明,也不会送出。
本题正确答案为B。
2. ①八进制----> 十进制(31.5)(八)整数部分:3*8(1)+1*8(0)=25小数部分:5*8(-1)=0.625所以(31.5)(八)=(25.625)(十)②十六进制----> 十进制(19.A)(十六)整数部分:1*16(1)+9*16(0)=25小数部分:10*16(-1)=0.625所以(19.A)(十六)=(25.625)(十)3. 若执行下面程序段后的输出为:3,4,5,请填空。
int a,b=3,c=5;a=b<c?【3】:c++;printf("%d,%d,%d",a,b,c);分析:本题考查条件运算符和增量运算符的概念,题中b<C为真,应取B++的值给A,因B的值是先用后增1,所以A为3,题中的C++没有执行到,C保持原值。
4. 与其它高级语言相比,在C语言中赋值号并不是优先级最低的,C语言中优先级最低的运算符是逗号运算符。
5. C语言语句一行写不下时,可以【D 】。
A) 用逗号换行B) 用分号换行C) 用回车换行D) 在任意一空格处换行6. 表达式5%(-3)的值是2 ,表达式-5%(-3)的值是-2 。
分析:注意到%运算符只能两边为整数,且其作用是取余数,与正负无关,二%的优先级高于符号。
7. 在C语言中,格式输入库函数为scanf 格式输出库函数为printf 。
8. C语言中构造类型的数据有三种:数组、结构体和共用体,数组是同类型数据的集合,结构体是不同类型的数据集合。
C语言常见错误集合大全-完整版-程序员必备手册5篇第一篇:C语言常见错误集合大全-完整版-程序员必备手册C语言的最大特点是:功能强、使用方便灵活。
C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。
看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,写给各位学员以供参考。
1.书写标识符时,忽略了大小写字母的区别。
main(){ int a=5;printf(“%d”,A);} 编译程序把a和A认为是两个不同的变量名,而显示出错信息。
C认为大写字母和小写字母是两个不同的字符。
习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2.忽略了变量的类型,进行了不合法的运算。
main(){ float a,b;prin tf(“%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语句中不可缺少的一部分,语句末尾必须有分号。
C语言运行程序错误及解决方法集锦一、基础知识和数据类型、表达式1、{},[],(),‘’,“”不配对。
解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。
2、忘记在语句的末尾加分号,或在预处理命令后多加分号。
记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。
3、混淆/和\;注释对应的符号是/* */,而转义字符是以\开头,除号是/。
4、printf()和scanf()的参数设置有误,主要表现在以下几方面:(1)类型不匹配的问题。
(例如:有float a=3.5,但输出的时候printf(“a=%d”,a);则屏幕上会显示出a=0.00000或者提示其它运行错误)。
基本原则是:float对应%f, int对应%d, char 对应%c。
(2)个数不匹配。
无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容,表示输出格式。
剩下的n-1个是输出的变量或者输入的变量的地址。
需要注意的是,如果后边有n-1个参数,那么前边一定对应n-1个%f一类的格式说明符。
(3)scanf()中变量前忘了加&。
记住:scanf()中变量前要有&(但后边学到的字符数组名和指针前不用加)5、定义标识符的时候经常出现使用非法字符的情况,例如:标识符中不能用空格,也就是说不能有这样的定义:int radium of circle;一般情况下可用下划线将三个单词连接在一起。
6、在使用变量前未定义,或未初始化。
例如:若下边的sum未定义,则在编译时会提示相应的错误信息,而若未初始化为0,则求和的结果一定是错误的。
void main(){ int I,a[10], sum=0; /*只要下边要用,这个定义就必须要有,一般情况下也要有初始值*/ for(I=0;I<10;I++) sum+=a[I];printf(“%d”,sum);}7、计算错误。
下列链表中,其逻辑结构属于非线性结构的是A) 二叉链表B) 循环链表C) 双向链表D) 带链的栈【解析】在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。
带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,是线性表。
在单链表中的结点中增加一个指针域指向它的直接前件,这样的链表,就称为双向链表(一个结点中含有两个指针),也是线性链表。
循环链表具有单链表的特征,但又不需要增加额外的存贮空间,仅对表的链接方式稍做改变,使得对表的处理更加方便灵活,属于线性链表。
二叉链表是二叉树的物理实现,是一种存储结构,不属于线性结构。
答案为A选项。
设循环队列的存储空间为Q(1: 35),初始状态为front=rear=35。
现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为A) 15B) 16C) 20D) 0或35、【解析】在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。
只不过当头尾指针指向向量上界时,其加1操作的结果是指向向量的下界0。
由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时,头尾指针均相等。
答案为D选项。
void fun(int m,int k,int xx[]){int i,j,n;for(i=m+1,n=0;n<k;i++) /*找大于m的素数,循环k次,即找出紧靠m的k个素数*/ {for(j=2;j<i;j++) /*判断一个数是否为素数,如果不是,跳出此循环,判断下一个数*/if(i%j==0) break;if(j>=i) /*如果是素数,放入数组xx中*/xx[n++]=i;}}一·下列叙述中正确的是()。
A) 循环队列有队头和队尾两个指针,因此,循环队列是非线性结构B) 在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况C) 在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况D) 循环队列中元素的个数是由队头指针和队尾指针共同决定【解析】循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以A)错误;在循环队列中只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况,所以B)与C)错误。
二·下列叙述中正确的是()。
A) 顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的B) 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构C) 顺序存储结构能存储有序表,链式存储结构不能存储有序表D) 链式存储结构比顺序存储结构节省存储空间【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。
链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误。
三·数据流图中带有箭头的线段表示的是()。
A) 控制流B) 事件驱动C) 模块调用D) 数据流【解析】数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。
四·在软件开发中,需求分析阶段可以使用的工具是()。
A) N-S图B) DFD图C) PAD图D) 程序流程图【解析】在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B)。
五、在面向对象方法中,不属于"对象"基本特点的是()。
A) 一致性B) 分类性C) 多态性D) 标识唯一性【解析】对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。
所以选择A)。
六、一间宿舍可住多个学生,则实体宿舍和学生之间的联系是()。
A) 一对一B) 一对多C) 多对一D) 多对多【解析】因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。
七、在数据管理技术发展的三个阶段中,数据共享最好的是()。
A) 人工管理阶段B) 文件系统阶段C) 数据库系统阶段D) 三个阶段相同【解析】数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。
其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位,所以选择C)。
八、有三个关系R、S和T如下:由关系R和S通过运算得到关系T,则所使用的运算为()。
A) 笛卡尔积B) 交C) 并D) 自然连接【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据T关系中的有序组可知R与S进行的是自然连接操作。
【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B)错误。
笛卡尔积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以C)错误。
根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组所以取得是交运算,选择D)。
九、以下选项中,能用作数据常量的是()。
A) 115LB) 0118C) 1.5e1.5D) o115【解析】A)选项中115L表示115是长整型数据,合法。
B)选项是八进制常量的表示方法,但是在八进制中不能含有数字8,所以B)错误。
C)选项中e后面应该是整数不能是小数1.5,所以C)错误。
D)选项中八进制常量应该是数字"0"开始,而不是字母"o"开始。
十、若有定义int x,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?(x++) :(y ++)中的条件表达式(x-y) 等价的是()。
A) (x-y<0||x-y>0)B) (x-y<0)C) (x-y>0)D) (x-y==0)【解析】条件表达式:x=表达式1?表达式2:表达式3 的含义是:先求解表达式1,若为非0(真),则求解表达式2,将表达式2的值赋给x。
若表达式1的值为0(假),则求解表达式3,将表达式3的值赋给x。
在本题中与表达式1:(x-y)等价的是(x-y<0||x-y>0)。
十一、有以下程序:#include <stdio.h>main(){int x=1,y=0;if (!x) y++;else if (x==0)if (x) y+=2;else y+=3;printf("%d\n",y);}程序运行后的输出结果是()。
A) 3B) 2C) 1D) 0【解析】在if else语句中else总是与离它最近的if配对。
本题目中x为1所以!x为0,所以执行else if语句中的内容,判断(x==0)是否成立,因为x为1所以条件不成立,所以else if 内部的if…else语句不再执行,所以y的值还是初始值0。
十二、若有定义:float x=1.5;int a=1,b=3,c=2;则正确的switch语句是()。
A) switch(a+b){ case 1:printf("*\n");case 2+1:printf("**\n");}B) switch((int)x);{ case 1:printf("*\n");case 2:printf("**\n");}C) switch(x){ case 1.0:printf("*\n");case 2.0:printf("**\n");}D) switch(a+b){ case 1:printf("*\n");case c:printf("**\n");}【解析】B)选项中switch((int)x);语句中不应该有最后的分号。
switch(expr1),中的expr1不能用浮点类型或long类型,也不能为一个字符串,所以C)错误。
case后面常量表达式的类型必须与switch后面表达式的类型一致,所以D)错误。
十三、有以下程序:#include <stdio.h>main(){ int n,*p=NULL;*p=&n;printf("Input n:");scanf("%d",&p);printf("output n:");printf("%d\n",p);}该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是()A) int n,*p=NULL;B) *p=&n;C) scanf("%d",&p)D) printf("%d\n",p);【解析】选项B)的正确写法应为p=&n;选项C)的正确写法应为scanf("%d",p);选项D)的正确写法应为printf("%d\n",*p)。
十四、有以下程序:#include <stdio.h>main(){int a[]={2,3,5,4},i;for(i=0;i<4;i++)switch(i%2){ case 0:switch(a[i]%2){case 0:a[i]++;break;case 1:a[i]--;} break;case 1:a[i]=0;}for(i=0;i<4;i++) printf("%d ",a[i]);printf("\n");}程序运行后的输出结果是()。
A) 0 3 0 4B) 2 0 5 0C) 3 3 4 4D) 3 0 4 0【解析】第一次循环i为0,i%2为0,执行switch(a[0]%2)中的case 0语句后内容即a[0]++,a[0]的值变成3;第二次循环i的值为1,i%2为1,执行case 1:a[i]=0;所以a[1]的值变成0;第三次循环i的值为2,i%2为0,执行switch(a[2]%2)中的case 1语句后的内容a[2]--,a[2]的值变成4;第四次循环i的值为3,i%2为1,执行case 1:a[i]=0;所以a[3]的值变成0。
十五、以下语句中存在语法错误的是()。
A) char ss[6][20];ss[1]="right?";B) char ss()[20]={ "right?"};C) char *ss[6];ss[1]="right?";D) char *ss()={ "right?"};【解析】数组定义后,不可以对数组整体赋值,s是二维数组,因ss[1]是一维字符数组,即字符串,字符串赋值可以使用strcpy(ss[1],"right");这样的形式,而选项A)中对二维数组中的第"1"维(相当于一个一维数组)赋值,是不可以的。