qsort结构

时间:2017-11-07 04:22:16

标签: c arrays struct qsort

我试图基于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;
}

2 个答案:

答案 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)

您的代码有两个错误

  1. 您正在使用q1->arr->a来比较您应该使用q1->a的位置(其中q1的类型为const struct s2)。 @GauravSehgal在answer

  2. 中也对此进行了解释
  3. 如果你看一下qsort的第三个参数,它实际上是要以字节为单位进行比较的每个元素的大小。但是你已经传递了元素的数量。将您的电话改为 -

    qsort(myStruct.arr, 10, sizeof(struct s2), comp);

  4. 你应该得到理想的结果。

    还有一些其他要点需要照顾(@Stargateur指出) -

    1. q1q2声明为const struct s2*类型,因为您不想丢弃const限定符。

    2. 分配到ab时,请勿明确投出q1q2,因为它们属于const void*类型,会自动升级为任何const类型的指针。