使用 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
值,将导致 double
到 int
和小数的隐式转换部分将从返回值中丢弃。
如果你使用的是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
}
我尝试按单价对一组产品进行排序,但结果不起作用。
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
值,将导致 double
到 int
和小数的隐式转换部分将从返回值中丢弃。
如果你使用的是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
}