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

如何简化C语言qsort多字段优先级排序的compare比较函数

比较函数简化方案

核心思路是通过封装宏来消除重复的if判断逻辑,完全保留原有排序规则,简化后的实现如下:

前置修正

你原有代码缺少<string.h>头文件(用到了strncmp函数),先在代码头部引入:

#include <string.h>

简化后的比较函数代码

// 升序比较宏:a>b返回1,a<b返回-1,相等则继续执行后续逻辑
#define CMP_ASC(field) do { \
    if ((*a1)->field > (*b1)->field) return 1; \
    if ((*a1)->field < (*b1)->field) return -1; \
} while(0)

// 降序比较宏:a>b返回-1,a<b返回1,相等则继续执行后续逻辑
#define CMP_DESC(field) do { \
    if ((*a1)->field > (*b1)->field) return -1; \
    if ((*a1)->field < (*b1)->field) return 1; \
} while(0)

int compare (const void * a, const void * b) 
{
    struct test** a1 = (struct test**) a;
    struct test** b1 = (struct test**) b;

    CMP_ASC(experience);
    CMP_ASC(land);
    CMP_DESC(nest);
    CMP_ASC(shoe);
    // hat字符串字段单独处理(降序规则)
    int hat_cmp = strncmp((*b1)->hat, (*a1)->hat, MAX_HAT);
    if (hat_cmp != 0) return hat_cmp;
    CMP_ASC(boys);
    CMP_DESC(cake);
    CMP_DESC(price);
    CMP_DESC(bean);
    CMP_DESC(room);
    CMP_DESC(father);
    CMP_DESC(industry);
    CMP_DESC(foot);
    CMP_ASC(angle);
    CMP_ASC(kitty);
    CMP_ASC(attraction);
    CMP_DESC(thread);

    return 0;
}

// 取消宏定义避免污染全局命名空间
#undef CMP_ASC
#undef CMP_DESC

说明

  • 宏内使用do{}while(0)是C语言多行宏的标准写法,可避免宏展开后出现语法错误
  • 所有排序优先级、升降序规则和原有代码完全一致,无逻辑改动
  • 代码长度大幅缩短,后续调整排序规则只需调整行顺序或替换升降序宏即可,维护成本更低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:09:03