C语言中姓名按字母排序、ID降序排序的代码问题求助
修复你的C语言排序代码问题
刚接触C语言遇到排序问题很正常,我帮你梳理下代码里的问题,然后给出修正后的版本,满足你姓名按字母顺序排序,姓名相同时ID按数值从高到低排序的需求。
首先看代码里的几个关键问题:
1. 结构体中id的类型错误
你定义的struct class里id是int *(指针类型),但初始化的时候直接给了整数值(比如2000),这会让指针指向内存地址为2000的位置——这是非法内存,打印的时候会输出乱码甚至程序崩溃。应该把id改成普通的int类型。
2. 比较函数compare逻辑完全不符合需求
你的compare函数里犯了几个混淆性错误:
- 把姓名的比较结果命名为
gendercompare,完全混淆了概念; - 返回
-gendercompare会让姓名按逆字母序排列,而不是你要的正序; - 姓名相同时,你错误地用了
e2->gender - e1->gender,这是两个字符串首地址的差值,完全不是比较性别(而且你需求里也没说要按性别排序,是ID从高到低); - 完全没有用到
id字段来处理排序优先级。
正确的逻辑应该是:
- 先比较姓名:用
strcmp(e1->name, e2->name),如果结果不为0,直接返回这个结果(实现正序); - 如果姓名相同,就比较ID:返回
e2->id - e1->id(这样ID大的排在前面)。
3. 缺少必要的头文件
你用了strcmp函数,必须包含<string.h>头文件,否则编译器可能会报错或者行为异常。
4. main函数的规范问题
C语言标准要求main函数的返回类型是int,并且最后应该加上return 0;来表示程序正常结束。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 必须包含strcmp所需的头文件 struct class { char gender[13]; char name[13]; int id; // 把指针改成普通int类型 }; // 正确的比较函数 int compare(const void *s1, const void *s2) { struct class *e1 = (struct class *)s1; struct class *e2 = (struct class *)s2; // 先按姓名字母顺序比较 int name_compare = strcmp(e1->name, e2->name); if (name_compare != 0) { return name_compare; // 正序排列 } // 姓名相同时,按ID从高到低排序 return e2->id - e1->id; } int main() { // 规范的main函数返回类型 int i; int employeecount; struct class info[] = { {"male", "AAA", 2000}, {"female", "BBB", 1000}, {"male", "AAA", 3000} // 加一个姓名相同的测试用例,看ID排序效果 }; employeecount = sizeof(info) / sizeof(info[0]); // 用sizeof自动计算数量,更灵活 printf("排序前:\n"); for (i = 0; i < employeecount; ++i) printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); printf("\n"); qsort(info, employeecount, sizeof(struct class), compare); printf("排序后:\n"); for (i = 0; i < employeecount; ++i) printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); return 0; // 程序正常结束返回0 }
运行结果说明
上面的代码里我加了一个姓名为AAA、ID为3000的测试用例,运行后输出:
排序前: 2000 male AAA 1000 female BBB 3000 male AAA 排序后: 3000 male AAA 2000 male AAA 1000 female BBB
可以看到:
- 姓名
AAA的条目排在BBB前面(字母正序); - 姓名相同的
AAA条目,ID大的3000排在2000前面(ID降序),完全符合你的需求。
内容的提问来源于stack exchange,提问作者user11125717
相关产品推荐
相关产品推荐

