c - Qsort删除元素

标签 c qsort

我正在尝试使用 qsort 对一组结构进行排序,但是当我显示排序后的结构时,除了一个之外,所有结构都丢失了。

以下是我的代码的相关部分:

typedef struct {
    char firstName[20];
    char lastName[20];
    float height;
} myStruct;

...

 else if (argc > 2) {
            FILE * inf;
            inf = fopen(argv[2], "r");
            errorCheck(fscanf(inf, "%d", &numStructs));
            people = (myStruct*)malloc(sizeof(myStruct) * numStructs);
            for (int i = 0; i < numStructs; ++i) {
                    errorCheck(fscanf(inf, "%s %s %f", firstName, lastName, &height));
                    person = people + (sizeof(myStruct) * i);
                    initMyStruct(person, firstName, lastName, height);
            }
            printf("struct read in");
    }

...

    if (strcmp(argv[1], "last") == 0) {
            fprintf(stdout, "last name sort if statement, \n");
            //myStruct* person = people + (sizeof(myStruct));
            qsort(people, numStructs, sizeof(myStruct), lastCmp);
    }
    else {
            fprintf(stdout, "height sort if statement, \n");
            //myStruct* person = people + (sizeof(myStruct));
            qsort(people, numStructs, sizeof(myStruct), heightCmp);
    }

和我的比较函数

int lastCmp(const void *a, const void *b) {
        myStruct* c = (myStruct *)a;
        myStruct* d = (myStruct *)b;
        return(strcmp(c->lastName, d->lastName));
}

int heightCmp(const void* a, const void* b) {
        myStruct *personA = (myStruct *)a;
        myStruct *personB = (myStruct *)b;
        return((personA->height > personB->height) - (personB->height > personA->height));
}

这是输出:

First name: Abigail, last name: Egan, height: 5.300000, 
First name: Jim, last name: Gardner, height: 5.500000,
First name: Jenna, last name: Adams, height: 5.500000,
First name: Maggie, last name: Johnson, height: 4.900000,
First name: Chelsea, last name: Harrison, height: 5.400000,
First name: Anna, last name: DeHart, height: 5.000000,

First name: , last name: , height: 0.000000,
First name: , last name: , height: 0.000000,
First name: , last name: , height: 0.000000,
First name: , last name: , height: 0.000000,
First name: , last name: , height: 0.000000,
First name: Abigail, last name: Egan, height: 5.300000,

(我对可读性表示歉意,格式没有保留。)如果您需要查看我的代码的其他部分,请告诉我。第一个输出是读入后立即输出的结构数组。第二个输出是排序后的输出。我需要继续使用 qsort,我不能使用其他方法。

最佳答案

无法可靠地分析您的问题,因为您没有发布最小、完整且可验证示例的实际源代码。您还需要发布输入到程序中。

我将对观察到的行为提出一个可能的解释:

  • 您对 fscanf() 成功的测试不正确:针对 EOF 的测试不够充分,您必须检查 fscanf()转换 3 个输入并返回 3。不正确的输入将导致 fscanf() 返回一个短计数,并且输入将被后续调用忽略,从而使变量处于不一致的状态。

  • 不正确的输入例如 Michael J Fox 5.2:firstName 将得到 Michael,lastName 将得到 J 并转换为 height 会失败。后续调用将消耗不同步的输入流...

关于c - Qsort删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481240/

相关文章:

c++ - 超出索引 C/C++

c++ - 如何初始化 GLfloat 数组?

c - 为什么这个 qsort() 不起作用?

c++ - 如何使用 qsort 对结构(由几个不同的元素组成)进行排序?

c - 轮询锁是实现关键部分的正确方法吗?

c - 如何在 Linux 中显示所有用户进程 [with date, parent id, user-name]?

c - 需要帮助使用 qsort 对 C 中的结构数组进行排序

c - qsort 一个字符串数组,比较

c - 二进制文件的 fseek 行为

c++ - 从缓冲区读取可变长度记录 - 奇怪的内存问题