qsort 结构数组降序
qsort array of structs descending order
我有一个看起来像这样的结构
typedef struct id_score{
int id;
int score;
} pair;
大小为 50 的数组包含指向这些对的指针
pair* array[50]
我的比较函数是这样的
int struct_cmp(const void *a, const void* b) {
pair* ia = (pair*)a;
pair* ib = (pair*)b;
printf("ia's score: %d ib's score: %d??? \n", ia->score, ib->score);
return ib->score - ia->score;
}
我的 qsort 函数在这里
size_t arr_len = sizeof(array) / sizeof(pair);
qsort(array, arr_len, sizeof(pair), struct_cmp);
现在我的问题是,在 struct_cmp
函数中,我的 printf
显示我认为应该是数组中每个结构中的计数的值都被解释为 0
,因此根本不对数组进行排序。当我通过数组打印时,在函数之外,结构具有它应该具有的分数。
有什么建议吗??谢谢!
一个
size_t arr_len = sizeof(array) / sizeof(pair);
以上是错误的,因为您的数组包含 pair
个指针,而不是 pair
个。更地道一点且重复更少的做法是:
size_t arr_len = sizeof(array) / sizeof(array[0]);
另一件需要注意的事情是,您的比较函数转换为错误的指针类型,因此您的程序的行为未定义。
记住回调函数将接收指向数组元素的指针,因此如果数组包含指针,它应该将参数转换为指向指针的指针:
int struct_cmp(const void *a, const void* b) {
pair* const * ia = (pair* const *)a;
pair* const * ib = (pair* const *)b;
printf("ia's score: %d ib's score: %d??? \n", ia->score, ib->score);
return (*ib)->score - (*ia)->score;
}
与你原来的功能不同,我也努力使它的const正确。比较回调接受指向 const 的指针,因此转换后的指针也应该指向 const(const 应用于元素类型,即 pair*
)。
正如 chux 所指出的,作为一种避免减法溢出的方法,一个主要的改进是 return 以下内容:
return ((*ib)->score > (*ia)->score) - ((*ib)->score < (*ia)->score);
它也有很好的 属性 总是 returning -1、0 或 1 而不是任意数字。
我有一个看起来像这样的结构
typedef struct id_score{
int id;
int score;
} pair;
大小为 50 的数组包含指向这些对的指针
pair* array[50]
我的比较函数是这样的
int struct_cmp(const void *a, const void* b) {
pair* ia = (pair*)a;
pair* ib = (pair*)b;
printf("ia's score: %d ib's score: %d??? \n", ia->score, ib->score);
return ib->score - ia->score;
}
我的 qsort 函数在这里
size_t arr_len = sizeof(array) / sizeof(pair);
qsort(array, arr_len, sizeof(pair), struct_cmp);
现在我的问题是,在 struct_cmp
函数中,我的 printf
显示我认为应该是数组中每个结构中的计数的值都被解释为 0
,因此根本不对数组进行排序。当我通过数组打印时,在函数之外,结构具有它应该具有的分数。
有什么建议吗??谢谢!
一个
size_t arr_len = sizeof(array) / sizeof(pair);
以上是错误的,因为您的数组包含 pair
个指针,而不是 pair
个。更地道一点且重复更少的做法是:
size_t arr_len = sizeof(array) / sizeof(array[0]);
另一件需要注意的事情是,您的比较函数转换为错误的指针类型,因此您的程序的行为未定义。
记住回调函数将接收指向数组元素的指针,因此如果数组包含指针,它应该将参数转换为指向指针的指针:
int struct_cmp(const void *a, const void* b) {
pair* const * ia = (pair* const *)a;
pair* const * ib = (pair* const *)b;
printf("ia's score: %d ib's score: %d??? \n", ia->score, ib->score);
return (*ib)->score - (*ia)->score;
}
与你原来的功能不同,我也努力使它的const正确。比较回调接受指向 const 的指针,因此转换后的指针也应该指向 const(const 应用于元素类型,即 pair*
)。
正如 chux 所指出的,作为一种避免减法溢出的方法,一个主要的改进是 return 以下内容:
return ((*ib)->score > (*ia)->score) - ((*ib)->score < (*ia)->score);
它也有很好的 属性 总是 returning -1、0 或 1 而不是任意数字。