使用结构的两个字段比较qsort的函数?

时间:2014-05-19 07:28:01

标签: c structure qsort

我们假设我们有一个结构:

     struct product 
 {
    char name[30]; 
    float price;
 };

我想首先使用qsort按价格对其进行排序,如果价格相等,则按名称排序。我怎么想写比较函数:

    int compare(const void *a, const void *b )
{
    int comp =  a.price - b.price;

    if (comp < 0 )
    return 1
    if (comp > 0 )
        return 0;


    comp = strcmp(a.name, b.name);

   if ( comp  < 0 )
       return 1;
   else
   if ( comp > 0 ) 
       return 0;

}

由于我只使用qsort的常用比较功能,我不知道如何解决这个问题。我认为我根据给出的错误错误地访问了字段,所以你能指出我写错比较函数的错误吗?

1 个答案:

答案 0 :(得分:2)

您编写的代码有几个语法错误,而且您的比较功能也没有达到您想要的效果。引用qsort的联机帮助页:

  

比较函数必须返回小于,等于或的整数          如果第一个参数被认为是re​​spec-大于零          小于,等于或大于第二个。如果两个成员          bers比较相同,它们在排序数组中的顺序是未定义的。

请考虑以下代码:

#include <stdlib.h>
#include <string.h>

struct product {
    char name[30]; 
    float price;
};

int compare(const void *a, const void *b) {

  const struct product *x = a;   // void* can be assigned to any other pointer type
  const struct product *y = b;

  int comp =  x->price - y->price;

  if (comp < 0)
    return -1;

  if (comp > 0)
    return 1;

  comp = strcmp(x->name, y->name);

  return comp;
}

如果要反转排序顺序,请在适当的位置否定comp

正如其他人所提到的,这是C代码,并不是惯用的C ++。