使用 qsort 对 C 中的结构数组进行排序

Using qsort to sort an array of structs in C

我尝试按单价对一组产品进行排序,但结果不起作用。

typedef struct {
    int supply;
    int totalPrice;
    double unitPrice;
} Product;

int comparator(const void * a, const void * b) {
    return (*(Product*) b).unitPrice - (*(Product*) a).unitPrice;
}

int main() {
    Product m[3] = {
        {18, 75, 4.17},
        {15, 72, 4.80},
        {10, 45, 4.50}
    };
    qsort(m, 3, sizeof(Product), comparator);
    for (int i = 0; i < 3; i++) {
        printf("unitPrice=%f\n", m[i].unitPrice);
    }
}

comparator 坏了。它减去两个 double 值和 return 一个 int。减法结果中的任何分数都将丢失,因此相距小于一个单位的数字将被视为相等。

如果项目不同,请将其固定为 return 一个 non-zero 数字。

从 returns int 类型值的函数返回 double 值,将导致 doubleint 和小数的隐式转换部分将从返回值中丢弃。

如果你使用的是gcc编译器,尝试用-Wconversion选项编译,编译器会给出警告:

 warning: implicit conversion turns floating-point number into integer: 'double' to 'int' [-Wfloat-conversion]
    return (*(Product*) b).unitPrice - (*(Product*) a).unitPrice;
    ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

你可以这样做:

int comparator(const void * a, const void * b) {
    double first = (*(Product*) a).unitPrice;
    double second = (*(Product*) b).unitPrice;

    if (second > first) {
        return 1;
    } else if (second < first) {
        return -1;
    }
    return 0; // second == first
}