我正在尝试基于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;
}

最佳答案

你的代码有两个错误
您正在使用q1->arr->a比较应该在哪里使用q1->a(其中q1const struct s2类型)。这也被@GauravSehgal在他的answer
如果您查看qsort的第三个参数,它准确地计算了要比较的每个元素的字节大小。但是您已经传递了元素的数量。把你的电话改成-
qsort(myStruct.arr, 10, sizeof(struct s2), comp);
你应该得到想要的结果。
还有一些你需要注意的地方(由@Stargateur指出)-
声明q1q2const struct s2*类型,因为您不想放弃const限定符。
分配给ab时不要显式转换q1q2,因为它们属于const void*类型,可自动升级为任何常量类型的指针。

10-06 12:43
查看更多