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

C语言数组排序后无法完整显示元素的问题排查求助

问题排查与修复方案

我来帮你分析一下问题所在,主要有两个核心问题导致了你的输出异常:

1. main函数中重复调用排序函数的错误

你在输出排序后数组的循环里,每次迭代都调用了ordonnerTableau(dtab, 5),这意味着每打印一个元素前,你都会重新对数组排序一遍。这种操作不仅完全没必要,还会因为数组在多次排序过程中被反复修改,最终导致输出混乱(你看到的仅显示最后一个元素就是这个错误带来的副作用)。

正确的做法是:先调用一次排序函数完成数组排序,保存返回的数组指针,再用这个指针遍历输出。

2. 冒泡排序函数的逻辑错误

你的ordonnerTableau函数实现的冒泡排序存在两个关键问题:

  • 数组越界风险:内层的while(tab[j] > tab[j+1])没有限制j的范围,当j增长到4时,j+1=5,访问tab[5]属于数组越界,会触发未定义行为(程序可能崩溃、输出错误值等)。
  • 排序逻辑错误:冒泡排序的核心是每一轮把当前未排序部分的最大元素“冒”到末尾,你的外层循环和内层while循环的组合完全不符合这个逻辑,导致排序无法正确完成。

修正后的完整代码

修正后的ordonnerTableau函数:

int * ordonnerTableau(int tab[], int taille){
    int tmp;
    // 外层循环:控制排序的轮数,只需要循环taille-1次即可完成排序
    for (int i = 0; i < taille - 1; i++){
        // 内层循环:每一轮只需要比较到未排序的最后一个元素(末尾i个元素已经有序)
        for (int j = 0; j < taille - 1 - i; j++){
            if(tab[j] > tab[j+1]){
                // 交换两个元素
                tmp = tab[j];
                tab[j] = tab[j+1];
                tab[j+1] = tmp;
            }
        }
    }
    return tab;
}

修正后的main函数:

int main(int argc, char** argv) {
    int dtab[5] = {12, 9, 2, 1, 0};
    printf("Avant :\n");
    for (int k = 0; k < 5; k++) {
        printf("tab[%d]=%d\n",k , dtab[k]);
    }
    printf("\n");
    
    // 仅调用一次排序函数,保存排序后的数组指针
    int *sortedTab = ordonnerTableau(dtab, 5);
    
    printf("Après :\n");
    for (int j = 0; j < 5; j++) {
        printf("tab[%d]=%d \n",j , sortedTab[j]);
        // 也可以用*(sortedTab + j),和sortedTab[j]等价
    }
    return 0; // 建议添加main函数的标准返回值
}

修正后的输出

运行修正后的代码,你会得到符合预期的输出:

Avant :
tab[0]=12
tab[1]=9
tab[2]=2
tab[3]=1
tab[4]=0

Après :
tab[0]=0 
tab[1]=1 
tab[2]=2 
tab[3]=9 
tab[4]=12 

内容的提问来源于stack exchange,提问作者Yacine TAZDAIT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:57:36