我们假设我们有一个结构:
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的常用比较功能,我不知道如何解决这个问题。我认为我根据给出的错误错误地访问了字段,所以你能指出我写错比较函数的错误吗?
答案 0 :(得分:2)
您编写的代码有几个语法错误,而且您的比较功能也没有达到您想要的效果。引用qsort
的联机帮助页:
比较函数必须返回小于,等于或的整数 如果第一个参数被认为是respec-大于零 小于,等于或大于第二个。如果两个成员 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 ++。