我试图基于int值对结构中的结构数组进行排序。我已经成功地对一组结构进行了排序,但我猜测我在某处为嵌套结构传递了一个错误的值。
我只需要将数组中的结构排序为a。
的值结构设置如下:
struct s2{
int a;
int b;
};
struct s1{
int c;
struct s2 arr[10];
}
我有比较功能:
int comp(const void *a, const void *b){
struct s1 *q1 = (struct s1 *)a;
struct s1 *q2 = (struct s1 *)b;
return(q1->arr->a - q2->arr->a);
}
我打电话给qsort:
struct s1 myStruct;
size_t theLen = sizeof(myStruct.arr) / sizeof(struct s2);
qsort(myStruct.arr, 10, theLen, comp);
输入:
10, 5, 7, 20, 17, 9, 3, 11, 15, 1
我得到输出:
2147451181, 589824, 327680, 65536, 131072, 4, 5, 11, 15, 8
我猜这可能与我如何申报长度有关?
谢谢!
文件行是:
10 5 7 20 17 9 3 11 15 1
myStruct.arr [i] .a使用fgets和sscanf从文件输入填充:
fgets(t, sizeof(t), fp);
sscanf(t, "%d,...,%d", &myStruct.arr[0].a,...,&myStruct.arr[9].a);
myStruct.arr [i] .b填充了for循环:
for(int i = 0; i < 10; i++){
myStruct.arr[i].b = i+1;
}
答案 0 :(得分:1)
qsort(myStruct.arr, 10, theLen, comp);
您在这里对myStruct.arr
进行排序,其中每个元素的类型为struct s2
。所以您的比较应该是
int comp(const void *a, const void *b){
struct s2 *q1 = (struct s2 *)a;
struct s2 *q2 = (struct s2 *)b;
return(q1->a - q2->a);
}
编辑:qsort
的第三个参数是要排序的数组的每个元素的大小。所以它应该是
qsort(myStruct.arr, theLen, sizeof(struct s2), comp);
答案 1 :(得分:1)
您的代码有两个错误
您正在使用q1->arr->a
来比较您应该使用q1->a
的位置(其中q1
的类型为const struct s2
)。 @GauravSehgal在answer
如果你看一下qsort的第三个参数,它实际上是要以字节为单位进行比较的每个元素的大小。但是你已经传递了元素的数量。将您的电话改为 -
qsort(myStruct.arr, 10, sizeof(struct s2), comp);
你应该得到理想的结果。
还有一些其他要点需要照顾(@Stargateur指出) -
将q1
和q2
声明为const struct s2*
类型,因为您不想丢弃const
限定符。
分配到a
和b
时,请勿明确投出q1
和q2
,因为它们属于const void*
类型,会自动升级为任何const类型的指针。