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