qsort 结构中的结构数组

qsort an array of structs in a struct

我正在尝试根据 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;
}
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 的第三个参数是数组每个元素的大小 sorted.So 它应该是

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

你的代码有两个错误

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

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

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

你应该会得到想要的结果。

还有一些需要注意的地方(@Stargateur 指出)-

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

  2. 在分配给 q1q2 时不要显式转换 ab 因为它们属于 const void* 类型自动提升为任何 const 类型的指针。