c - qsort结构数组删除一切

标签 c arrays struct qsort

所以我在使用 qsort 对结构数组进行排序时遇到了问题。

我以这个链接为例:http://support.microsoft.com/kb/73853

当我运行该程序时,它为结构中最初的名称提供了空白,为 gp 的所有值提供了零。

typedef int (*compfn)(const void*, const void*);

struct record
{
    char player[20];
    int gp;
};
struct record entries[15];

int compare(struct record *, struct record *);


void show ()           
{
    int v;
    qsort((void *)entries, 10, sizeof(struct record), (compfunc)compare);
    struct record *p = entries;
    for(v=0;v<counter;v++, p++)
    {
         printf("%s ..... %d \n", p->player , p->gp);
    }
}

int compare(struct record * p1, struct record * p2)
{
     if( p1->gp < p2->gp)
         return -1;
     else if (p1->gp > p2->gp)
         return 1;
     else
         return 0;
}

编辑:大家好,非常感谢你们的帮助,但是,我已经尝试了你们所说的一切,但它仍然只是将所有值都归零

最佳答案

您的调用可以简化,无需转换为 void *:

qsort(entries, 10, sizeof entries[0], compare);

注意使用 sizeof entries[0] 来避免数组类型的无意义重复。

比较函数也不应该强制转换,因为它应该简单地定义为匹配原型(prototype):

static int compare(const void *a, const void *b)
{
  const struct record *ra = a, *rb = b;

  if( ra->gp < rb->gp)
     return -1;
  if (ra->gp > rb->gp)
     return 1;
  return 0;
}

顺便说一句,仅供引用,这里有一个经典的(?)方法来简化您有时会在这些地方看到的三向测试:

return (ra->gp < rb->gp) ? -1 : (ra->gp > rb->gp);

我不反对这种表达方式,特别是如果您是初学者,但我认为我会包括它,因为它很相关,而且可能对您有所启发。

关于c - qsort结构数组删除一切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16230710/

相关文章:

带有可变参数的 C printf 说明符。未定义的行为在哪一点上有问题?

arrays - 我如何找到阵列中的间隙?

c - 访问结构数组中的值

嵌套取消引用的成本可以忽略不计吗?

c - Lua和C之间是什么关系?

c - 为什么修改字符串文字会导致段错误?

arrays - 数组与链表

javascript - 在 Javascript 中,如何检测包含子数组和单个元素的数组中的不同类型的元素?

c++ - 结构字段访问

可以有超过 1 个进程使用 MPI_Scatter 吗?