【问题标题】:Using qsort() with Structs将 qsort() 与结构一起使用
【发布时间】:2017-10-10 16:02:45
【问题描述】:

我刚开始学习 C,但我还是新手。 在这个程序中,我正在使用一个结构数组。结构是:

typedef struct {
    int day;
    int month;
    int year;
} Date;

typedef struct {
    int serial_num;
    char full_name[15];
    Date *pDate;
} Person;

数组是Person *people

现在我有两个人数组和这些人的出生日期(相同的索引):

const char* names[MAX] = { "Sasson_Sassoni", "Pooh", "James_Bond", "Elvis_is_Alive", "Shilgiya", "Cleopatra", "Sissoo_VeSimmhoo" };

const int dates[MAX][COLS] = {
        { 10, 1, 1988 },
        { 12, 12, 1948 },
        { 4, 12, 1970 },
        { 11, 11, 1890 },
        { 11, 11, 1948 },
        { 1, 10, 1213 },
        { 12, 11, 1948 }
    };

通过使用switch case,每次用户键入 1 时,列表中的一个人(姓名和生日)都会添加到列表 people。然后,如果用户键入 3,则列表 people 应按日期排序(从大到小)。于是我写了以下两个函数:

void sortList(Person **people, int index) {
    qsort(*people, index, sizeof(Person), intcmp);
}
int intcmp(const void *a, const void *b) {
    Person *one = (Person *)a;
    Person *two = (Person *)b;
    int year1 = one->pDate->year;
    int year2 = two->pDate->year;
    int month1 = one->pDate->month;
    int month2 = two->pDate->month;
    int day1 = one->pDate->day;
    int day2 = two->pDate->day;
    if (year1 > year2)
        return -1;
    else if (year2 > year1)
        return 1;
    if (month1 > month2)
        return -1;
    else if (month2 > month1)
        return 1;
    if (day1 > day2)
        return -1;
    else if (day2 > day1)
        return 1;
    return 0;
}

但是每次我得到一个错误提示:

Exception thrown: read access violation.
one->pDate was nullptr.

有什么帮助吗? 谢谢!

编辑: 进一步说明:为了将人一个一个地插入到数组中,我创建了一个名为 index 的变量,每次添加一个人时,索引都会增加一。所以在调用函数 qsort() 时,index 是数组中的人数。还有MAX=7, COLS=3, LEN=10。将人员添加到数组中的函数是:

void addToList(Person **people, int *index, const char *names[MAX], const int dates[][COLS]) {
    people[*index] = (Person *)malloc(sizeof(Person));
    people[*index]->serial_num = *index + 1;
    strcpy(people[*index]->full_name, names[*index]);
    Date *temp = (Date *)malloc(sizeof(Date));
    temp->day = dates[*index][0];
    temp->month = dates[*index][1];
    temp->year = dates[*index][2];
    people[*index]->pDate = temp;
    printf("%d %s     %d/%d/%d \n", people[*index]->serial_num, people[*index]->full_name, people[*index]->pDate->day, people[*index]->pDate->month, people[*index]->pDate->year);
    *index = *index + 1;
}

【问题讨论】:

  • 请提供minimal reproducible example。例如index 的值是多少,people 是什么?
  • @Stargateur - 有点跳了枪,你不觉得吗?此消息来自运行时。它与正在编译的语言无关。
  • @eitanmayer - 为了帮助我们一劳永逸地解决这个问题,char *c = malloc(1); 是按原样在您的程序中编译,还是必须添加演员表?
  • @eitanmayer - 使用的编译器会影响语义!使用 C 编译器,而不是 C++ 编译器。如果您还没有,请将您的项目切换到 C 模式。
  • 你应该有一个函数可以打印出你的数组中的数据。您应该在调用排序之前使用该函数以确保您的数据设置正确。这样您就可以对自己的排序结果更有信心了。

标签: c arrays struct qsort


【解决方案1】:

您的 mcve 不完整,但我认为这是因为您混淆了指针和结构:

void sortList(Person **people, int index) {
    qsort(people, index, sizeof(Person *), intcmp);
    // or qsort(people, index, sizeof *people, intcmp);
}

int intcmp(const void *a, const void *b) {
    const Person *one = *(const Person **)a;
    const Person *two = *(const Person **)b;

【讨论】:

  • 哇,好用!我一直坚持这个,谢谢!
  • 顺便说一句,很好地使用const而不是使用Person *one = *(Person **)a;
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多