C语言升序插入数组异常:如何消除首元素始终为0的问题
数组升序插入时首元素始终为0的问题解决
我需要实现从键盘读取元素直至输入负数,将元素插入数组并始终保持升序的功能。但运行自己写的代码后,发现数组首元素始终是0,求解决方法。
我的代码如下:
#include <stdio.h> #include <stdlib.h> int a[100], nr_elem=0; void InsertInAscendingOrder(int x){ int i; int pos; for(i=0; i<nr_elem; i++){ if(a[i]>x){ pos = i; break; } else{ a[nr_elem] = x; } } for(int k=nr_elem; k>=pos; k--){ a[k] = a[k-1]; } a[pos] = x; nr_elem++; } void printArray(){ for(int i=0; i<nr_elem; i++){ printf("%d ", a[i]); } } int main() { int x; do{ InsertInAscendingOrder(x); printf("x="); scanf("%d", &x); }while(x>0); printArray(); return 0; }
运行输出:
x=10 x=13 x=4 x=90 x=5 x=17 x=-1 0 4 5 10 13 17 90
问题根源
- 首次调用传入未初始化的x:
main函数的do-while循环先执行插入操作,此时x还没被scanf赋值,是内存中的随机值(这里恰好为0),导致第一个插入的元素是0。 - 插入函数逻辑漏洞:
- 数组为空(
nr_elem=0)时,for循环不会执行,pos变量未初始化就被使用,属于未定义行为。 else分支里的a[nr_elem] = x完全多余,后续的移位插入会覆盖该值,还会在每次循环满足a[i]<=x时重复赋值。
- 数组为空(
修复后的代码
#include <stdio.h> #include <stdlib.h> int a[100], nr_elem=0; void InsertInAscendingOrder(int x){ int pos = nr_elem; // 默认插入到数组末尾 // 找到第一个大于x的元素位置 for(int i=0; i<nr_elem; i++){ if(a[i]>x){ pos = i; break; } } // 从后往前移位,腾出插入位置 for(int k=nr_elem; k>pos; k--){ a[k] = a[k-1]; } a[pos] = x; nr_elem++; } void printArray(){ for(int i=0; i<nr_elem; i++){ printf("%d ", a[i]); } } int main() { int x; // 先读取输入再判断,避免传入未初始化的x printf("x="); scanf("%d", &x); while(x>0){ InsertInAscendingOrder(x); printf("x="); scanf("%d", &x); } printArray(); return 0; }
修复点说明
- 调整输入顺序:先读取
x再执行插入,避免首次调用时传入未初始化的变量。 - 初始化pos变量:默认将
pos设为数组末尾,既处理x比所有元素都大的情况,也避免数组为空时pos未定义。 - 移除多余赋值:删除
else分支里的无效赋值,简化逻辑。 - 优化移位循环:将循环条件改为
k>pos,避免不必要的自我赋值,逻辑更严谨。
内容的提问来源于stack exchange,提问作者ProfessorEmanuel
相关产品推荐
相关产品推荐

