gpt4 book ai didi

c - 需要帮助使用 qsort 对 C 中的结构数组进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 03:26:22 25 4
gpt4 key购买 nike

我有这个结构。

struct Transport
{
int id;
float Price;
};

在这里,我将数据读入结构数组。

void read (struct Transport **Car, int *m)
{
int i;
printf("Insert total number of cars: ");
scanf("%d",m);
*Car=(struct Transport*) malloc ((*m)*3*sizeof(struct Transport));

for(i=1; i<=*m; i++)
{
(*Car)[i].id=i;
printf("Price: ");
scanf("%f",&(*Car)[i].Price);
printf("\n");
}
}

这里是显示函数。

void display(struct Transport *Car,int m)
{
int i;
for(i=1; i<=m; i++)
{
printf("Entry #%d: \n",i);
printf("Price: %2.2f\n",(Car+i)->Price);
printf("\n");
}
}

现在问题来了。我必须按价格字段对数据进行排序。到目前为止,我已经试过了,但它什么也没做。

int struct_cmp_by_price(const void *a, const void *b)
{
struct Transport *ia = (struct Transport *)a;
struct Transport *ib = (struct Transport *)b;
return (int)(100.f*ia->Price - 100.f*ib->Price);
}

这是主要的样子。

int main()
{
int m;
struct Transport *Car;
read(&Car,&m);
qsort(Car, m, sizeof(struct Transport), struct_cmp_by_price);
display(Car,m);
return 0;
}

谁能帮帮我?

最佳答案

您的代码中存在多个问题:

  • 您在 read() 中分配了太多内存, 你不需要转换 malloc() 的返回值在 C 中,但你应该检查分配失败。你应该改用:

    *Car = calloc(*m, sizeof(struct Transport));
    if (*Car == NULL) {
    fprintf(stderr, "cannot allocate memory for %d structures\n", *m);
    exit(1);
    }
  • 你不应该使用 read作为函数名,因为它是系统调用的名称,可能与该函数的标准库使用冲突。使用 readTransport .

  • 索引是 0基于 C。而不是 for(i=1; i<=*m; i++) ,使用:

    for (i = 0; i < *m; i++)
  • 比较函数不能使用减法技巧。事实上,减法技巧只能用于小于 <int 的整数类型。 .改用这个:

    int struct_cmp_by_price(const void *a, const void *b) {
    const struct Transport *ia = a;
    const struct Transport *ib = b;
    return (ia->Price > ib->Price) - (ia->Price < ib->Price);
    }
  • 您应该测试 scanf() 的返回值检测无效输入。 Price在转换失败的情况下,成员将保持未初始化状态,这会导致未定义的行为,除非您使用 calloc() , 但结果仍然没有意义。

关于c - 需要帮助使用 qsort 对 C 中的结构数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40876657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com