C Qsort对结构数组进行排序

C Qsort对结构数组进行排序,c,arrays,sorting,struct,qsort,C,Arrays,Sorting,Struct,Qsort,我试图用qsort对结构数组进行排序。但是,我在理解如何创建比较函数方面遇到了问题。我有以下结构: typedef struct { char name[TEAM_SIZE]; int points; } TEAM; 我试着按照每支球队的得分排序,第一名是最高的 qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points); 和比较功能: int compare_points(const void *a, const void

我试图用qsort对结构数组进行排序。但是,我在理解如何创建比较函数方面遇到了问题。我有以下结构:

typedef struct {
  char name[TEAM_SIZE];
  int points;
} TEAM;
我试着按照每支球队的得分排序,第一名是最高的

qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points);
和比较功能:

int compare_points(const void *a, const void *b) {
  TEAM *p1 = (TEAM *)a;
  TEAM *p2 = (TEAM *)b;

  if(p1->points < p2->points) {
    return 1;
  }
  else {
    return -1;
  }
}
您的
qsort()
调用错误:

第三个参数必须是数组中每个元素的大小。而是传递整个数组的大小或指针的大小,具体取决于
team
的声明方式。你想要:

qsort(team, NUMBER_OF_TEAMS, sizeof(TEAM), compare_points);
另外,您的比较函数有一点缺陷,当
p1->points==p2->points
时,它返回-1。由于您似乎在对
积分
成员进行排序,因此当两个团队的积分相同时,您的比较函数应该返回0

示例

#include <stdio.h>
#include <stdlib.h>

#define TEAM_SIZE 10

typedef struct {
    char name[TEAM_SIZE];
    int points;
} TEAM;


int compare_points(const void *a, const void *b)
{
    const TEAM *p1 = a;
    const TEAM *p2 = b;
    return p2->points < p1->points ? -1 : p1->points < p2->points;
}

int main()
{
    TEAM teams[] =
    {
        { "OB",  46 }, { "AGF", 37 },
        { "AAB", 50 }, { "FCK", 71 },
        { "HOB", 18 }, { "SDR", 62 },
        { "RFC", 47 }, { "BIF", 54 },
        { "EFB", 30 }, { "VFF", 40 }
    };

    size_t NUM_TEAMS = sizeof teams / sizeof *teams;

    qsort(teams, NUM_TEAMS, sizeof(TEAM), compare_points);

    for (size_t i=0; i< NUM_TEAMS; ++i)
        printf("%s : %d\n", teams[i].name, teams[i].points);

    return 0;
}

您的
qsort()
调用错误:

第三个参数必须是数组中每个元素的大小。而是传递整个数组的大小或指针的大小,具体取决于
team
的声明方式。你想要:

qsort(team, NUMBER_OF_TEAMS, sizeof(TEAM), compare_points);
另外,您的比较函数有一点缺陷,当
p1->points==p2->points
时,它返回-1。由于您似乎在对
积分
成员进行排序,因此当两个团队的积分相同时,您的比较函数应该返回0

示例

#include <stdio.h>
#include <stdlib.h>

#define TEAM_SIZE 10

typedef struct {
    char name[TEAM_SIZE];
    int points;
} TEAM;


int compare_points(const void *a, const void *b)
{
    const TEAM *p1 = a;
    const TEAM *p2 = b;
    return p2->points < p1->points ? -1 : p1->points < p2->points;
}

int main()
{
    TEAM teams[] =
    {
        { "OB",  46 }, { "AGF", 37 },
        { "AAB", 50 }, { "FCK", 71 },
        { "HOB", 18 }, { "SDR", 62 },
        { "RFC", 47 }, { "BIF", 54 },
        { "EFB", 30 }, { "VFF", 40 }
    };

    size_t NUM_TEAMS = sizeof teams / sizeof *teams;

    qsort(teams, NUM_TEAMS, sizeof(TEAM), compare_points);

    for (size_t i=0; i< NUM_TEAMS; ++i)
        printf("%s : %d\n", teams[i].name, teams[i].points);

    return 0;
}

什么不起作用?@EliSadoff不,这是一个危险的快捷方式,可能会因整数溢出而出错。@EliSadoff如果你想使用良好的实践,那么就使用它,不要认为它无关紧要。这不是一个好的建议。问题是否可能是使用
sizeof(team)
而不是
sizeof(team)
?@EliSadoff正要说同样的话。什么不起作用?@EliSadoff不,这是一个危险的快捷方式,可能会因为整数溢出而出错。@EliSadoff如果你想使用好的做法,那么就使用它,我不认为这无关紧要。这不是一个好的建议。问题是否可能是使用
sizeof(team)
而不是
sizeof(team)
FCK : 71
SDR : 62
BIF : 54
AAB : 50
RFC : 47
OB : 46
VFF : 40
AGF : 37
EFB : 30
HOB : 18