【问题标题】:using qsort function to sort a struct使用 qsort 函数对结构进行排序
【发布时间】:2021-05-08 02:19:23
【问题描述】:

所以我需要使用 qsort() 对包含结构的数组进行排序

#include <stdio.h>

// =========
struct pair
{
    int encounters;
};// pair{}

int compaireEncounters(const void*, const void*);

int main()
{
    struct pair* working[5];
    working[0]->encounters = 10;
    working[1]->encounters = 3;
    working[2]->encounters = 1;

    qsort(working, 5, sizeof(struct pair), compareEncounters);
    int i = 0;
    while (i < 3)
    {
        printf("%d \n", working[i]->encounters)
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv)
{
    int a = ((struct pair*)av)->encounters;
    int b = ((struct pair*)bc)->encounters;
    return(a > b);
}

我正在尝试获取输出:

1 
3
10

但是我得到了一个分段错误核心转储。

这里有什么问题?

【问题讨论】:

  • 你为什么声明一个指向类型结构对的指针数组而不是相同类型的对象?!
  • 我不确定你在这个问题中要问什么,因为我还是 C 的新手。但是我需要将数据从哈希表复制到我称为工作的数组中
  • 什么是 unclea?一切都清楚。您声明了一个指针数组 struct pair* working[5];而不是结构对类型的对象数组,例如结构对工作[5];为什么?此外,您调用 qsort 就好像您有一个对象数组而不是指针数组 qsort(working, 5, sizeof(struct pair), compareEncounters);也就是说,您使用的是 sizeof( struct pair ) 而不是 sizeof( struct pair * )。
  • 我很抱歉,因为我不知道更好,使用它的正确方法是什么?

标签: c linux ubuntu struct qsort


【解决方案1】:

在取消引用指针之前,您必须将指针分配给有效缓冲区。

在这种情况下,working 应该是结构数组,而不是指针数组。

别忘了初始化所有要排序的元素。

您的代码中还有更多错误:

  • 使用 qsort 时未包含正确的标头 (stdlib.h)
  • main 函数中使用了未声明的 compareEncounters
  • printf() 语句后缺少分号。
  • compaireEncounters 函数中使用了未声明的 bc

固定代码:

#include <stdio.h>
#include <stdlib.h>

// =========
struct pair{
    int encounters;
};// pair{}

int compaireEncounters(const void* , const void*);

int main() {
    struct pair working[5];
    working[0].encounters = 10;
    working[1].encounters = 3;
    working[2].encounters = 1;
    working[3].encounters = 334;
    working[4].encounters = 42;

    qsort(working, 5, sizeof(struct pair), compaireEncounters);
    int i = 0;
    while (i < 3) {
        printf("%d \n", working[i].encounters);
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv){
    int a = ((struct pair*)av)->encounters;
    int b = ((struct pair*)bv)->encounters;
    return(a > b);
}

如果你想使用指针数组,

  • 分配缓冲区并在取消引用之前分配它们。
  • 修复qsort() 的元素大小。
  • 修复compaireEncounters 以比较指向结构的指针。
#include <stdio.h>
#include <stdlib.h>

// =========
struct pair{
    int encounters;
};// pair{}

int compaireEncounters(const void* , const void*);

int main() {
    struct pair* working[5];
    working[0] = malloc(sizeof(*working[0])); working[0]->encounters = 10;
    working[1] = malloc(sizeof(*working[1])); working[1]->encounters = 3;
    working[2] = malloc(sizeof(*working[2])); working[2]->encounters = 1;
    working[3] = malloc(sizeof(*working[3])); working[3]->encounters = 334;
    working[4] = malloc(sizeof(*working[4])); working[4]->encounters = 42;

    qsort(working, 5, sizeof(*working), compaireEncounters);
    int i = 0;
    while (i < 3) {
        printf("%d \n", working[i]->encounters);
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv){
    int a = (*(struct pair**)av)->encounters;
    int b = (*(struct pair**)bv)->encounters;
    return(a > b);
}

【讨论】:

  • 有没有办法让它与结构对*一起工作?这是我的 MRE 示例,仅使用代码的 sn-p,我正在将数据从哈希表传输到该数组中
  • @itsMe 是的,添加了。
  • 您的努力得到了极大的赞赏。您的解决方案确实解决了我遇到的问题。
  • qsort 比较函数应该返回一个小于、等于或大于 0 的值,而当前比较函数不这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 2021-04-07
  • 2014-07-04
相关资源
最近更新 更多