You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题根源

  1. 首次调用传入未初始化的x:main函数的do-while循环先执行插入操作,此时x还没被scanf赋值,是内存中的随机值(这里恰好为0),导致第一个插入的元素是0。
  2. 插入函数逻辑漏洞:
    • 数组为空(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:31:26