如何使用 qsort 对结构数组进行排序
How to sort an array of structs using qsort
它应该按学生姓氏的字母顺序对学生进行排序。我试着用
qsort,但它不起作用。
struct student {
char name[30];
char lastName[30];
char grades[30][5];
int numberOfGrades;
};
int compare(const void *a, const void *b) {
struct group *s1 = (struct group *)a;
struct group *s2 = (struct group *)b;
return strcmp(s1->lastName, s2->lastName);
}
int main()
{
struct student group[30];
group[0].lastName = "Malaska";
group[1].lastName = "Kowalski";
group[2].lastName = "Adamczyk";
group[3].lastName = "Bakiewicz";
int numberOfStudents = 4;
qsort(group, numberOfStudents, sizeof(group), compare);
}
以下是对您的代码进行更正和注释后的改编:
struct student {
char name[30];
char lastName[30];
char grades[30][5];
int numberOfGrades;
};
//Note, error incomplete type occurs
//when using `struct group *s1 = (struct group *)a;`
//will replace with `struct student`
int compare(const void *a, const void *b) {
const struct student *s1 = (struct student *)a;
const struct student *s2 = (struct student *)b;
return strcmp(s1->lastName, s2->lastName);
}
int main()
{
struct student group[30];//local scope, will not be recognized in 'compare()'
strcpy(group[0].lastName, "Malaska");//string assignments need to use strcpy or similar, not =
strcpy(group[1].lastName, "Kowalski");
strcpy(group[2].lastName, "Adamczyk");
strcpy(group[3].lastName, "Bakiewicz");
int numberOfStudents = 4;
//sending correct size of each element
qsort(group, numberOfStudents, sizeof(group[0]), compare);
// ^^^^^^^^^^^^^^^^^
}
以下也是对您的代码的改编,但对构造进行了一些额外的更改,如果在您正在学习的范围内,应该提供更多关于可读性、范围的使用、[=12 的使用的示例=],以及动态内存分配和释放...
typedef struct { //use of `typedef struct {` rather than 'struct name {`
char name[30];
char lastName[30];
char grades[30][5];
int numberOfGrades;
}student_s; //new type, can be used in place of `struct student` anywhere.
int compare(const void *a, const void *b) {
const student_s *s1 = (student_s *)a;
const student_s *s2 = (student_s *)b;
return strcmp(s1->lastName, s2->lastName);
}
int main()
{
int numberOfStudents = 4;//moved to top so can use group
//to properly size instances of group
//dynamic memory allocation, and clean up at bottom
student_s *group = calloc(numberOfStudents, sizeof *group);
if(group)//test here to ensure success
{
strcpy(group[0].lastName, "Malaska");
strcpy(group[1].lastName, "Kowalski");
strcpy(group[2].lastName, "Adamczyk");
strcpy(group[3].lastName, "Bakiewicz");
qsort(group, numberOfStudents, sizeof(group[0]), compare);
//... more code as necessary
//when finished with 'group', free it.
free(group);
}
}
它应该按学生姓氏的字母顺序对学生进行排序。我试着用 qsort,但它不起作用。
struct student {
char name[30];
char lastName[30];
char grades[30][5];
int numberOfGrades;
};
int compare(const void *a, const void *b) {
struct group *s1 = (struct group *)a;
struct group *s2 = (struct group *)b;
return strcmp(s1->lastName, s2->lastName);
}
int main()
{
struct student group[30];
group[0].lastName = "Malaska";
group[1].lastName = "Kowalski";
group[2].lastName = "Adamczyk";
group[3].lastName = "Bakiewicz";
int numberOfStudents = 4;
qsort(group, numberOfStudents, sizeof(group), compare);
}
以下是对您的代码进行更正和注释后的改编:
struct student {
char name[30];
char lastName[30];
char grades[30][5];
int numberOfGrades;
};
//Note, error incomplete type occurs
//when using `struct group *s1 = (struct group *)a;`
//will replace with `struct student`
int compare(const void *a, const void *b) {
const struct student *s1 = (struct student *)a;
const struct student *s2 = (struct student *)b;
return strcmp(s1->lastName, s2->lastName);
}
int main()
{
struct student group[30];//local scope, will not be recognized in 'compare()'
strcpy(group[0].lastName, "Malaska");//string assignments need to use strcpy or similar, not =
strcpy(group[1].lastName, "Kowalski");
strcpy(group[2].lastName, "Adamczyk");
strcpy(group[3].lastName, "Bakiewicz");
int numberOfStudents = 4;
//sending correct size of each element
qsort(group, numberOfStudents, sizeof(group[0]), compare);
// ^^^^^^^^^^^^^^^^^
}
以下也是对您的代码的改编,但对构造进行了一些额外的更改,如果在您正在学习的范围内,应该提供更多关于可读性、范围的使用、[=12 的使用的示例=],以及动态内存分配和释放...
typedef struct { //use of `typedef struct {` rather than 'struct name {`
char name[30];
char lastName[30];
char grades[30][5];
int numberOfGrades;
}student_s; //new type, can be used in place of `struct student` anywhere.
int compare(const void *a, const void *b) {
const student_s *s1 = (student_s *)a;
const student_s *s2 = (student_s *)b;
return strcmp(s1->lastName, s2->lastName);
}
int main()
{
int numberOfStudents = 4;//moved to top so can use group
//to properly size instances of group
//dynamic memory allocation, and clean up at bottom
student_s *group = calloc(numberOfStudents, sizeof *group);
if(group)//test here to ensure success
{
strcpy(group[0].lastName, "Malaska");
strcpy(group[1].lastName, "Kowalski");
strcpy(group[2].lastName, "Adamczyk");
strcpy(group[3].lastName, "Bakiewicz");
qsort(group, numberOfStudents, sizeof(group[0]), compare);
//... more code as necessary
//when finished with 'group', free it.
free(group);
}
}