gpt4 book ai didi

c - 将 qsort() 与结构一起使用

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

我刚开始学习 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;
}

最佳答案

您的 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;

关于c - 将 qsort() 与结构一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46671131/

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