【问题标题】:qsort won't sort dynamically allocated array of structsqsort 不会对动态分配的结构数组进行排序
【发布时间】:2017-04-02 01:37:14
【问题描述】:

我有一个结构

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); 

【问题讨论】:

  • 显示初始化 comparePtr 的调用。另外,您是否进入调试模式并确保实际调用了您的比较函数?
  • @Tarik 我把它放在那里
  • 你能把代码减少到最少(删除多余的字段和空行),并展示一个完整的排序失败的例子吗?
  • 问题中的代码根本没有问题。您的错误必须在其他地方。

标签: c struct qsort


【解决方案1】:

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

#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);
    }
}

【讨论】:

  • 你缺少#include &lt;string.h&gt;,否则,工作正常。
  • @DavidC.Rankin 实际上是在代码的开头,还是您编辑我的答案?
  • 哦,不,没关系,这更像是一个注释,而不是任何类型的投诉。如果编译的人都想不通....说得够多了。
  • 在 C 语言中,struct info *part1 = (struct info *) a; 无需在此处强制转换(b 相同)。
  • @alk 谢谢,现在我用的是Rust,所以我忘记了C的一部分
猜你喜欢
  • 1970-01-01
  • 2014-05-21
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2021-06-23
  • 2021-12-15
相关资源
最近更新 更多