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

