【发布时间】:2018-02-21 11:48:32
【问题描述】:
我正在尝试使用 qsort() 对结构中的价格进行排序。排序后,结构中的元素(test)之一变为0。您能告诉我为什么以及如何解决它吗?
谢谢!
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int price;
int test;
int id;
} order;
order list[10];
int i = 0;
int compare (const void * a, const void * b)
{
order *orderA = (order *)a;
order *orderB = (order *)b;
return ( orderA->price - orderB->price );
}
int main ()
{
srand ( time(NULL) );
printf("Before sorting\n");
for(i=0; i<10; i++){
list[i].price = rand()%10;
list[i].test = rand()%10;
list[i].id = i;
printf ("Order id = %d Price = %d Test = %d\n",list[i].id, list[i].price, list[i].test);
}
printf("AFTER sorting\n");
int n;
qsort (list, 6, sizeof(order), compare);
for (n=0; n<10; n++)
printf ("Order id = %d Price = %d Test = %d\n",list[n].id, list[n].price, list[i].test);
return 0;
}
输出是:
排序前
订单 ID = 0 价格 = 4 测试 = 2
订单 ID = 1 价格 = 9 测试 = 3
订单 ID = 2 价格 = 5 测试 = 0
订单 ID = 3 价格 = 2 测试 = 8
订单 ID = 4 价格 = 8 测试 = 5
订单 ID = 5 价格 = 7 测试 = 4
订单 ID = 6 价格 = 9 测试 = 3
订单 ID = 7 价格 = 1 测试 = 1
订单 ID = 8 价格 = 8 测试 = 4
订单 ID = 9 价格 = 3 测试 = 3
分拣后
订单 ID = 3 价格 = 2 测试 = 0
订单 ID = 0 价格 = 4 测试 = 0
订单 ID = 2 价格 = 5 测试 = 0
订单 ID = 5 价格 = 7 测试 = 0
订单 ID = 4 价格 = 8 测试 = 0
订单 ID = 1 价格 = 9 测试 = 0
订单 ID = 6 价格 = 9 测试 = 0
订单 ID = 7 价格 = 1 测试 = 0
订单 ID = 8 价格 = 8 测试 = 0
订单 id = 9 价格 = 3 测试 = 0
【问题讨论】:
-
您只对前 6 个元素进行排序。
-
问题已解决。
-
注意:为避免
int溢出并处理所有int,请使用(orderA->price > orderB->price) - (orderA->price < orderB->price)而不是orderA->price - orderB->price -
一旦你将
i的声明移动到第一个for循环中,问题就很明显了。 See it here.