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

C语言qsort比较函数如何将void*转为结构体char[]成员实现排序

实现方案

核心逻辑

qsort 传入比较函数的const void *指针,本质指向数组中待比较的两个完整结构体元素的首地址,你只需要先将其强转为const struct person *类型,就可以正常访问结构体的name字段进行比较。

完整比较函数实现

#include <string.h> // 需引入strcmp对应的头文件

int compare_name(const void *a, const void *b) {
    // 强转为对应结构体的常量指针
    const struct person *pa = (const struct person *)a;
    const struct person *pb = (const struct person *)b;
    // 直接比较两个结构体的name字段即可
    return strcmp(pa->name, pb->name);
}

如果你不想用标准库的strcmp,也可以复用你之前手写的字符遍历逻辑,调整为操作结构体的name字段即可:

int compare_name(const void *a, const void *b) {
    const struct person *pa = (const struct person *)a;
    const struct person *pb = (const struct person *)b;
    const char *s1 = pa->name;
    const char *s2 = pb->name;
    for (; *s1 == *s2; s1++, s2++)
        if (*s1 == '\0') return 0;
    return *s1 - *s2;
}

注意事项

你原有代码存在几处笔误需要修正,否则无法正常编译运行:

  • 结构体定义中int age末尾缺少分号,改为int age;
  • 数组定义的struct student和结构体名struct person不统一,需要改成一致的命名
  • qsort调用中的sizeof(class)改为sizeof(people),用来计算people数组的总字节数

原理说明

你之前处理纯字符串数组时可以直接把void*转成char*,是因为字符串数组的每个元素本身就是字符数组,元素的首地址刚好等于字符串的首地址。虽然你现在的结构体第一个字段就是name,直接强转char*也能拿到字符串,但这种写法可读性差、后续修改结构体字段顺序时极易出问题,强转为结构体指针再取对应字段是规范写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:27:03