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

结构体中学生姓名字符串比较与按字母排序问题求助

解决你的C语言学生排序问题

咱们先一步步来,先搞定编译错误,再解决重名时的排序逻辑~

问题1:修复strcmp的编译错误

你遇到的'argument of type "bool" is incompatible with parameter of type "const char*"'错误,是因为括号位置写错了,导致把布尔值传给了strcmp函数。

原代码的错误写法:

if (strcmp((number_name_surname[0].name), (number_name_surname[1].name) < 0)); { }

这里你把number_name_surname[1].name < 0当成了strcmp的第二个参数——但字符串指针和0比较会得到布尔值(true/false),而strcmp需要的是两个const char*类型的字符串参数,类型完全不匹配。

修正后的代码:

// 把 <0 移到strcmp函数外面,同时去掉if后面多余的分号
if (strcmp(number_name_surname[0].name, number_name_surname[1].name) < 0) {
    // 这里写你的逻辑代码
}

解释:strcmp(a, b)会返回一个整数:

  • 返回值<0:a的字典序在b前面
  • 返回值=0:a和b完全相同
  • 返回值>0:a的字典序在b后面

问题2:重名时按姓氏排序

你当前的代码只是通过比较数组前两个元素来决定打印顺序,这并不是真正的全局排序逻辑——如果有多个学生,这种方式根本无法实现正确的姓名+姓氏排序。我们需要先对整个学生数组完成排序,再打印。

完整实现思路(以冒泡排序为例)

先实现排序逻辑,排序时遵循:先比名字,名字相同则比姓氏:

// 假设number_of_students是学生总数,number_name_surname是动态分配的结构体数组
for (int i = 0; i < number_of_students - 1; i++) {
    for (int j = 0; j < number_of_students - i - 1; j++) {
        // 第一步:比较名字
        int name_compare = strcmp(number_name_surname[j].name, number_name_surname[j+1].name);
        
        if (name_compare > 0) {
            // 前一个名字的字典序更大,交换两个学生
            num_nom_surname temp = number_name_surname[j];
            number_name_surname[j] = number_name_surname[j+1];
            number_name_surname[j+1] = temp;
        } else if (name_compare == 0) {
            // 名字相同,第二步:比较姓氏
            int surname_compare = strcmp(number_name_surname[j].surname, number_name_surname[j+1].surname);
            if (surname_compare > 0) {
                // 前一个姓氏的字典序更大,交换
                num_nom_surname temp = number_name_surname[j];
                number_name_surname[j] = number_name_surname[j+1];
                number_name_surname[j+1] = temp;
            }
        }
    }
}

排序完成后打印

排序结束后,数组里的学生已经按「名字升序,名字相同则姓氏升序」排列,直接顺序打印即可:

for (int i = 0; i < number_of_students; i++) {
    printf("\n Student N%c %5d - ", 167, number_name_surname[i].number);
    printf("Name: %s %s", number_name_surname[i].name, number_name_surname[i].surname);
}

这样不管是普通姓名还是重名的情况,都能得到正确的排序结果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:30:29