我正在尝试使用C中的内置qsort函数对结构进行排序
typedef struct abc{
long long int fir;
long long int sec;
}abc;
在比较函数中,我使用下面的代码,这样如果结构abc数组中任何两个元素之间的变量“fir”相同,那么排序条件将取决于变量“sec”。
long long int cmp(const abc* e1, const abc* e2)
{
if(e1->fir==e2->fir)
return e1->sec-e2->sec;
else
return e1->fir-e2->fir;
}
代码似乎无法正常运行。 这样做的正确方法是什么?
答案 0 :(得分:2)
long long int cmp(const abc* e1, const abc* e2)
没有qsort比较函数的正确签名,因此您的程序具有未定义的行为。您应该将编译器警告标志设置为高,并且它会警告您这些事情。
只要减法不能溢出,您的实际测试就可以了,这可能不会长时间存在问题。 修改此处的减法效果不佳,正是因为cmp
的返回值必须为int
。减法long long
的结果,如果您的值太大,结果太大而无法放入int
,qsort
肯定会产生错误的顺序。
更一般地说,这更准确:
int cmp(const void* v1, const void* v2)
{
const struct abc* p1 = v1;
const struct abc* p2 = v2;
if (p1->fir < p2->fir)
return -1;
else if (p1->fir > p2->fir)
return 1;
else
return p1->sec < p2->sec? -1 : p1->sec > p2->sec? 1 : 0;
}
答案 1 :(得分:0)
你正在使用的内置qsort可能需要一个“低于”(运算符&lt;)谓词,这是C ++的常规术语。只要参数不相等,你的两种情况都会返回true。
你必须返回真正的IFF(当且仅当)e1<e2
。