C qsort-won';t排序动态分配的结构数组
我有一个结构C qsort-won';t排序动态分配的结构数组,c,struct,qsort,C,Struct,Qsort,我有一个结构 struct info { char firstName[100]; char lastName[100]; char companyName[100]; char email[100]; unsigned long phoneNumber; }; 它存储在compareElements.h文件中 我将一组值读入动态分配的结构数组bptr中 我的comparePtr指向这个函数 #include <string.h> #
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));
}
}
问题在于,并非所有结构都需要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);
}
}
#包括
#包括
#包括
结构信息{
char lastName[100];
char companyName[100];
};
int compareNameAscending(常量无效*a,常量无效*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;
返回strcmp(s1,s2);
}
int main(){
结构信息bptr[2];
strcpy(bptr[0].lastName,“”;
strcpy(bptr[0]。公司名称,“Foo”);
strcpy(bptr[1]。姓“Boo”);
strcpy(bptr[1]。公司名称,“”;
qsort(bptr,sizeof(bptr)/sizeof(bptr[0]),sizeof(struct info),compareNameAscending;
尺寸i;
对于(i=0;i
我想您在初始化代码时遇到了问题,
不是如何使用它,这里是代码的简化版本,运行良好:
#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);
}
}
#包括
#包括
#包括
结构信息{
char lastName[100];
char companyName[100];
};
int compareNameAscending(常量无效*a,常量无效*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;
返回strcmp(s1,s2);
}
int main(){
结构信息bptr[2];
strcpy(bptr[0].lastName,“”;
strcpy(bptr[0]。公司名称,“Foo”);
strcpy(bptr[1]。姓“Boo”);
strcpy(bptr[1]。公司名称,“”;
qsort(bptr,sizeof(bptr)/sizeof(bptr[0]),sizeof(struct info),compareNameAscending;
尺寸i;
对于(i=0;i
显示初始化comparePtr的调用。另外,您是否进入调试模式并确保实际调用了比较函数?@Tarik我将其放在其中。您是否可以将代码减少到最低限度(删除冗余字段和空行),并显示一个无法排序的完整示例?问题中的代码没有根本错误。您的错误必须在别处。显示初始化comparePtr的调用。另外,您是否进入调试模式并确保实际调用了比较函数?@Tarik我将其放在其中。您是否可以将代码减少到最低限度(删除冗余字段和空行),并显示一个无法排序的完整示例?问题中的代码没有根本错误。你的错误一定在其他地方。你缺少#include
,否则就可以了。@DavidC.Rankin实际上是在代码的开头,或者你编辑了我的答案?哦,不,没关系,这更像是一个注释,而不是任何类型的投诉。如果编译它的人不能理解它。。。。说得够多了。在C中,不需要在这里强制转换struct info*part1=(struct info*)a代码>(与b
)相同。@alk谢谢,现在我用的是Rust
,所以我忘了C
的一部分,你丢失了#include
,否则,效果很好。@DavidC.Rankin实际上是在代码的开头,或者你编辑了我的答案?哦,不,那很好,这更像是一个注释,而不是任何类型的投诉。如果编译它的人不能理解它。。。。说得够多了。在C中,不需要在这里强制转换struct info*part1=(struct info*)a
(与b
)相同。@alk谢谢,现在我用的是Rust
,所以我忘了C