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

C语言实现站点名称冒泡排序代码出错如何排查修复

代码存在的问题

代码共有两处致命逻辑错误,外加一处C语言字符串用法错误,直接导致排序完全失效:

  • 字符串比较逻辑错误:C语言中char类型数组的数组名本质是数组首元素的内存地址,直接用>比较两个station_name数组,实际比较的是两个数组的内存地址高低,和字符串内容的字典序没有任何关系,根本无法判断站点名称的大小关系。
  • 元素交换索引错误:内层循环遍历相邻元素对(j, j+1)时,发现逆序需要交换这两个相邻元素,但原代码错误地交换了j位置和外层循环的i位置元素,完全打乱了数组顺序。
修复方法
  1. 引入C标准库头文件<string.h>,使用库函数strcmp做字符串字典序比较:该函数传入两个字符串地址,返回值大于0时代表第一个字符串字典序大于第二个,等于0代表两字符串相等,小于0代表第一个字符串更小。
  2. 修正交换逻辑的索引,交换相邻的j和j+1位置的元素。

修复后的完整代码如下:
sort.hpp头文件:

#include <string.h>

struct _element {
    char icao_code[5];
    char station_name[100];
};

typedef struct _element element;

void bubbleSort(element* stations, int size);

排序函数实现:

void bubbleSort(element *pElement, int size) {
    int i, j;
    for (i = 0; i < size - 1; i++) {
        // 末尾i个元素已经排好序,无需重复遍历
        for (j = 0; j < size - i - 1; j++) {
            if (strcmp(pElement[j].station_name, pElement[j + 1].station_name) > 0) {
                element tmp = pElement[j];
                pElement[j] = pElement[j + 1];
                pElement[j + 1] = tmp;
            }
        }
    }
}
补充提示

如果需要实现不区分大小写的站点名称排序,Windows平台可以替换strcmp为_stricmp,Linux/macOS平台可以替换为strcasecmp,函数返回值规则和strcmp完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:57:12