0

我正在尝试使用 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;
} 

该代码似乎无法正常工作。正确的方法是什么?

4

2 回答 2

2
long long int cmp(const abc*  e1, const abc* e2)

qsort 比较函数没有正确的签名,因此您的程序具有未定义的行为。您应该将编译器警告标志设置为高,它会警告您此类事情。

只要减法不会溢出,您的实际测试就可以了,这可能不是很长时间的问题。编辑这里的减法不好,正是因为返回值cmp必须是一个int. 减法的结果long long,所以如果你有很大的值,结果太大而无法放入 anint并且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;       
}
于 2013-04-07T20:13:39.697 回答
0

您使用的内置 qsort 可能需要一个“低于”(operator<) 谓词,这是 C++ 的正常术语。只要参数不相等,你的在这两种情况下都会返回 true。

您必须返回真正的 IFF (当且仅当) e1<e2

于 2013-04-07T20:05:05.670 回答