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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:23:20