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”;

        这里就是混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。
        C语言规定以 ‘\0’ 作为字符串结束标志,它是由系统自动加上的,所以字符串 “a” 实际上包含两个字符:‘a’ 和 ‘\0’,而把它赋给一个字符变量是不行的。

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<stio.h>

float fun(int n)
{
	
}

void main(void){
	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

        此时不用逗号而用空格或其它字符是不对的,如:

	3  4(中间为空格)
	34(中间为冒号)

8、输入字符的格式与要求不一致

        在用 “%c” 格式输入字符时,“空格字符” 和 “转义字符” 都将作为有效字符输入。例如:

	 scanf("%c%c%c", &c1, &c2, &c3);

        如输入:

	a b c

        字符 ‘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(garde){
	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(garde){
	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、在定义数据时,将定义的 “元素个数” 误认为是可使用的最大下标

        例如:

mian(){
	sattic int a[]={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 的匹配问题

        在不能准确确定 esle 与前面哪个 if 相匹配时,应遵循一原则:见到 else 后,要与它前面的离它最近的没有配对的那个 if 相匹配。

15、“\” 和 “/” 的混淆

        前者是除号,在进行相除运算时常会把 “/” 写成 “” ,应特别注意。

16、C语言关键字的拼写

        如:main——mian(错误),print——pirntf(错误),return——retrun(错误),while——While(错误)

17、在做改错题时要注意数字与拼音的区别

        字形相似的有:0(零)与 o,1(数字 1)与l(小写字母L)等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值