Есть несколько проблем, см. // <<<<
комментарии, которые я добавил:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // <<<< you forgot to include string.h
struct class {
char gender[13];
char name[13];
int id; // <<<< int *id; having a pointer here is pointless,
// you simple want an integer value here.
// That's the main problem in your code
};
int compare(const void *s1, const void *s2)
{
struct class *e1 = (struct class *)s1;
struct class *e2 = (struct class *)s2;
int gendercompare = strcmp(e1->name, e2->name);
if (gendercompare == 0)
return e2->gender - e1->gender;
else
return -gendercompare;
}
int main(void) // <<<< it's int main(void) , not main()
{
int i;
int employeecount;
struct class info[] = { {"male","AAA",2000},{"female","BBB",1000},{"male","CCC",3000} };
employeecount = 3;
for (i = 0; i < employeecount; ++i)
printf("%i\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
printf("\n");
// <<<< use employeecount instead of 3, it's the same thing but it's more consistent.
// Not something that would prevent your code from working
qsort(info, employeecount, sizeof(struct class), compare);
for (i = 0; i < employeecount; ++i)
printf("%i\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
}
Есть также логическая проблема в вашей функции compare
, кажется, вы хотите отсортировать по полу, сначала мужчины.
Поскольку функция сравнения должна возвращать значение <0, 0 или> 0, вы можете просто вернуть возвращаемое значение strcmp
.Также вам не нужны приведения, но e1
и e2
должны быть const
, поскольку s1
и s2
равны const
.
int compare(const void *s1, const void *s2)
{
const struct class *e1 = s1;
const struct class *e2 = s2;
return -strcmp(e1->gender, e2->gender);
}
См. Также ответ ConsistentProgrammer для получения информации офункция сравнения, сортирующая по имени.