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
相关产品推荐
相关产品推荐

