c语言课后习题数组章节易错题型解析

admin C语言 4


你是不是也这样?学数组的时候觉得还行,可一做课后习题就错漏百出?明明是照着例题写的代码,要么运行出错,要么结果不对,搜 “c 语言数组易错点”“数组常见错误” 出来的答案又太笼统。其实啊,数组章节的习题错误就那么几种,把它们弄明白了,做题能顺不少。兔子哥今天就把最容易出错的几种题型拆开来分析,保证你看完就知道咋避坑,一起往下看吧!
数组定义与初始化:别给太多 “料”
最基础的就是数组定义和初始化的题,比如 “定义一个包含 5 个整数的数组,初始化前 3 个元素为 1、2、3”。
有同学会写成这样:
int arr [5] = {1, 2, 3, 4, 5, 6};
编译的时候就会报错,为啥?因为定义的数组只能装 5 个元素,你却塞了 6 个,就像杯子就这么大,水倒多了肯定会洒出来。正确的应该是元素个数不超过数组长度,像 int arr [5] = {1,2,3}; 就没问题,剩下的元素会自动初始化为 0。
还有人定义数组时不写长度,却给了初始化值,比如 int arr [] = {1,2,3}; 这其实是对的,编译器会自动算长度。但要是既不写长度也不初始化,int arr []; 那就错了,编译器不知道要给多大空间。
下标访问:别 “越界”
数组下标越界是最最常见的错误,比如 “输出数组的所有元素” 这道题。
错误示例:
int arr [5] = {10, 20, 30, 40, 50};
for (int i=1; i<=5; i++)
{
printf ("% d", arr [i]);
}
你看,数组下标是从 0 开始的,arr [5] 根本不存在,运行的时候可能会输出乱码,甚至崩溃。正确的应该是 i 从 0 开始,i<5 结束。
还有道题 “找出数组中的最大值”,有人会把循环写成 for (i=1; i<5; i++),忘了比较第一个元素,结果可能漏掉最大值。得从 i=0 开始才对。
错误类型错误代码片段错误原因正确写法片段
初始化元素过多int arr[3] = {1,2,3,4};元素个数超过数组长度int arr[3] = {1,2,3};
下标从 1 开始for(i=1; i<=5; i++) printf("%d", arr[i]);忽略下标从 0 开始for(i=0; i<5; i++) printf("%d", arr[i]);
循环条件错误for (i=1; i<5; i++) 找最大值漏掉第一个元素for (i=0; i<5; i++) 找最大值

数组作为函数参数:别忘了 “长度”
数组作为函数参数时,错误就更多了。比如 “写一个函数求数组元素的和”。
错误写法:
int sum (int arr [])
{
int s = 0;
for (int i=0; i<5; i++)
{
s += arr [i];
}
return s;
}
主函数里传了个长度为 3 的数组,结果函数里还在算 5 个元素的和,肯定会出错。正确的做法是把数组长度也作为参数传进去:
int sum(int arr[], int len)
{
int s = 0;
for(int i=0; i{
s += arr[i];
}
return s;
}

这样不管数组多长,只要传对长度,就能算出正确的和。
字符串数组:别漏了结束符
字符串其实就是字符数组,但它有个特殊要求,必须以 '\0' 结尾。比如 “将两个字符串连接起来” 这道题。
很多人会写成这样:
void concat (char a [], char b [])
{
int i=0, j=0;
while (a [i] != '\0') i++;
while (b [j] != '\0')
{
a [i] = b [j];
i++;
j++;
}
}
看起来没问题,但连接后的字符串没有加 '\0',输出的时候可能会多出一些乱码。得在循环结束后加一句 a [i] = '\0'; 才对。
有人可能会问,怎么才能避免这些错误呢?兔子哥觉得,写代码的时候多想想数组的长度和下标范围,比如定义了 arr [5],就时刻提醒自己下标只能是 0 到 4。还有就是多调试,输出中间结果看看,比如循环的时候打印 i 的值,就能发现是不是越界了。
其实啊,数组题看着难,其实就是那几个坑,踩过几次,记住了,就不容易再错了。兔子哥当年做数组题,下标越界的错误犯了不下十次,后来把 “下标从 0 开始” 贴在屏幕上,慢慢就记住了。你要是哪道题总出错,别着急,多做几遍,肯定能掌握。

标签: 不知道 是不是

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~