我有一个结构
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);
答案 0 :(得分:4)
我想你的代码初始化有问题, 不是如何使用它,这里的代码的简化版本工作正常:
#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);
}
}