C语言使用指针实现数组操作时输入循环多执行、插入值异常问题排查
错误定位与修复方案
错误1:输入元素的for循环运行次数超出预期
- 错误原因:main函数中读取数组元素的
scanf格式串多写了\n。scanf的格式串中如果包含空白字符(空格、换行、制表符等),会跳过输入中所有连续的空白字符,直到匹配到非空白字符才会结束本次读取。因此你输入完预设长度的最后一个元素后按下的换行会被当作空白符跳过,程序会继续等待你输入下一个非空白字符,看起来就像多执行了一次循环。 - 修复方案:将
scanf("%d\n",&p.A[i]);中的\n删除,修改为scanf("%d",&p.A[i]);。
错误2:插入后出现随机值
- 错误原因:
inserting函数中判断数组是否已满的条件写的是赋值运算符=而非相等判断运算符==。代码执行时会直接将p->length赋值为p->size,只要p->size不为0,条件就判定为真,函数直接返回,不会执行后续插入逻辑。同时因为length被修改为和size相等,后续Display函数遍历到size长度,数组中超出原始length的位置都是未初始化的内存,所以会输出随机值。 - 修复方案:将
if(p->length=p->size)修改为if(p->length == p->size)。
修复后完整代码
#include<stdio.h> #include<stdlib.h> struct Array { int *A; int length; int size; } p; void Display(struct Array p) { int i; for(i=0;i<p.length;i++) { printf(" %d ",p.A[i]); } } void inserting(struct Array *p,int x) { int i=p->length-1; // 修改为双等号判断数组是否已满 if(p->length == p->size) { return; } while(i>=0 && p->A[i]>x) { p->A[i+1]=p->A[i]; i--; } p->A[i+1]=x; p->length++; } int main() { int i,ch,index,el,choice=1,c; printf("Enter size of array\n"); scanf("%d",&p.size); p.A=(int *)malloc(p.size * sizeof(int)); printf("Enter length of Array\n"); scanf("%d",&p.length); printf("ENTER elements in an array\n"); for(i=0;i<p.length;i++) { // 删除格式串中的多余换行符 scanf("%d",&p.A[i]); } inserting(&p,20); Display(p); // 补充释放堆内存,避免内存泄漏 free(p.A); return 0; }
内容的提问来源于stack exchange,提问作者Champii Mccullum
相关产品推荐
相关产品推荐

