gpt4 book ai didi

c - qsort 不会对动态分配的结构数组进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:07 24 4
gpt4 key购买 nike

我有一个结构

struct info {
char firstName[100];
char lastName[100];
char companyName[100];
char email[100];
unsigned long phoneNumber;
};

保存在文件compareElements.h中

我将一组值读入名为 bptr 的动态分配的结构数组中。

我的 comparePtr 指向这个函数。

#include <string.h>
#include "compareElements.h"
int compareNameAscending (const void *a, const void *b) {

struct info *part1 = (struct info *) a;
struct info *part2 = (struct info *) b;




if(part1 -> lastName[0] != '\0' && part2 -> lastName[0] != '\0') {
return (strcmp(part1 -> lastName , part2 -> lastName));
}
if (part1 -> lastName[0] == '\0' && part2 -> lastName[0] != '\0') {
return (strcmp(part1 -> companyName , part2 -> lastName));
}

if (part1 -> lastName[0] != '\0' && part2 -> lastName[0] == '\0') {
return (strcmp(part1 -> lastName, part2 -> companyName));
}

if (part1 -> lastName[0] == '\0' && part2 -> lastName[0] == '\0') {
return (strcmp(part1 -> companyName, part2 -> companyName));
}

}

在我的主要功能中

comparePtr = &compareNameAscending 

问题是并不是所有的结构都需要有一个 lastName 和 companyName 只是两者之一。所以我想按姓氏排序,如果他们没有姓氏,我将按公司名称排序。问题是我的 qsort 调用实际上并没有改变它只是吐出原始结构的顺序。这是 qsort 调用。

qsort(bptr, i, sizeof(struct info), comparePtr); 

最佳答案

我想你的代码初始化有问题,不是如何使用它,这里是您的代码的简化版本,可以正常工作:

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

struct info {
char lastName[100];
char companyName[100];
};

int compareNameAscending (const void *a, const void *b) {

const struct info *part1 = a;
const struct info *part2 = b;

const char *s1 = strcmp(part1->lastName, "") == 0 ?
part1->companyName : part1->lastName;
const char *s2 = strcmp(part2->lastName, "") == 0 ?
part2->companyName : part2->lastName;

return strcmp(s1, s2);
}


int main() {
struct info bptr[2];
strcpy(bptr[0].lastName, "");
strcpy(bptr[0].companyName, "Foo");
strcpy(bptr[1].lastName, "Boo");
strcpy(bptr[1].companyName, "");
qsort(bptr, sizeof(bptr) / sizeof(bptr[0]), sizeof(struct info), compareNameAscending);

size_t i;
for (i = 0; i < sizeof(bptr) / sizeof(bptr[0]); ++i) {
printf("company %s, name %s\n", bptr[i].companyName, bptr[i].lastName);
}
}

关于c - qsort 不会对动态分配的结构数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163754/

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