结构体中学生姓名字符串比较与按字母排序问题求助
解决你的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
相关产品推荐
相关产品推荐

