qsort结构数组删除所有内容

时间:2013-04-26 07:13:30

标签: 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;
}

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

2 个答案:

答案 0 :(得分:2)

您的通话可以简化,无需转发void *

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

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

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

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);

我不认为 这种表达方式,特别是如果你是初学者,但我认为我会把它包括在内,因为它是相关的,可能是教学的。

答案 1 :(得分:0)

除了微软支持页面是一个真正的混乱并且不是学习C的好资源这一事实之外,你的代码在这里缺少&

...
qsort((void *)entries, 10, sizeof(struct record), (compfunc)compare);
... 

应该是

...
qsort((void *)&entries, 10, sizeof(struct record), (compfunc)compare);
... 

另外,我认为你打算写

...
qsort((void *)&entries, 15, sizeof(struct record), (compfn)compare);
...