c - qsort 不排序并且输出奇怪

标签 c qsort

所以我正在使用C,我似乎无法让它正常工作。它是一个指向包含一些联系信息的结构的指针数组。我似乎无法让 qsort 正确排序。 这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
#define ELEMENTS 50

int sortZips(const void *a, const void *b);

typedef struct contactInfo {
char name[MAX];
char street[MAX];
char cityState[MAX];
char zipCode[MAX];
} contacts;


int main() {
int i = 0;
contacts **contactArray = malloc(ELEMENTS * sizeof(contacts *));     

/*  allocate array  */
for (i = 0; i < ELEMENTS; i++) {
    contactArray[i] = malloc(sizeof(contacts));
}
/*  populate array  */
for (i = 0; i < ELEMENTS; i++) {
    fgets(contactArray[i]->name,MAX,stdin);
    fgets(contactArray[i]->street,MAX,stdin);
    fgets(contactArray[i]->cityState,MAX,stdin);
    fgets(contactArray[i]->zipCode,MAX,stdin);

    printf("%s", contactArray[i]->name);
    printf("%s", contactArray[i]->street);
    printf("%s", contactArray[i]->cityState);
    printf("%s", contactArray[i]->zipCode);

}
printf("\n");


/*  qsort((void *)contactArray, ELEMENTS, sizeof(contacts *), sortZips);  */


for (i = 0; i < ELEMENTS; i++) {
    fputs(contactArray[i]->name,stdout);
    fputs(contactArray[i]->street,stdout);
    fputs(contactArray[i]->cityState,stdout);
    fputs(contactArray[i]->zipCode,stdout);
}


}


/*  sortZips() sort function for qsort  */

int sortZips(const void *a, const void *b) {

const contacts *ia = *(contacts **)a;
const contacts *ib = *(contacts **)b;
return strcmp(ia->zipCode, ib->zipCode);



}

输出是打印地址(我在输入文件中有 50 个),然后是一些随机字符,比如一大块,然后是排序后的列表,该列表困惑且排序不正确。

请提供任何帮助,我们将不胜感激。我需要了解这里出了什么问题以及原因。 谢谢。

最佳答案

第一条规则:始终检查输入函数 - 在本例中为 fgets()。如果不检查,您就不知道一切是否正常工作。

第二:一般情况下,优先使用 enum 而不是 #define

通过对早期 EOF 的检查,您的代码可以干净地对我的示例数据(6 行)进行排序。它还可以干净地编译 - 这是非常不寻常的(这是一种恭维;我使用严格的警告,甚至我的代码很少第一次就可以干净地编译)。我对您的代码的修改版本与您的非常相似:

int main(void)
{
    int i = 0;
    int num;
    contacts **contactArray = malloc(ELEMENTS * sizeof(contacts *));

    /*  allocate array  */
    for (i = 0; i < ELEMENTS; i++)
        contactArray[i] = malloc(sizeof(contacts));

    /*  populate array  */
    for (i = 0; i < ELEMENTS; i++)
    {
        if (fgets(contactArray[i]->name,MAX,stdin) == 0 ||
            fgets(contactArray[i]->street,MAX,stdin) == 0 ||
            fgets(contactArray[i]->cityState,MAX,stdin) == 0 ||
            fgets(contactArray[i]->zipCode,MAX,stdin) == 0)
            break;
        printf("%s", contactArray[i]->name);
        printf("%s", contactArray[i]->street);
        printf("%s", contactArray[i]->cityState);
        printf("%s", contactArray[i]->zipCode);
    }
    printf("\n");
    num = i;

    qsort(contactArray, num, sizeof(contacts *), sortZips);

    for (i = 0; i < num; i++)
    {
        fputs(contactArray[i]->name,stdout);
        fputs(contactArray[i]->street,stdout);
        fputs(contactArray[i]->cityState,stdout);
        fputs(contactArray[i]->zipCode,stdout);
    }
    return 0;
}

我使用的数据是 4 行集合的简单重复,如下所示:

First LastName7
7 Some Street
City, CA
95437
<小时/>

请注意,我在输入中执行的“错误检查”是“有效”的最低限度。如果输入中的行过长,则一个字段将不包含换行符,下一个字段将包含输入行的下一部分(可能是所有其余部分,也可能不是 - 这取决于该行的过长程度)。

关于c - qsort 不排序并且输出奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119459/

相关文章:

c - 在 C 中处理字符串时出现问题(打印它们)

c - 使用 C 查询自定义 DNS 服务器

c - 当数据到达时从 FIFO 读取数据 (linux)

c - qsort 没有正确排序内容,kruskal 算法

c - Malloc 示例因 qsort 崩溃?

c++ - 为什么我的shared_ptr会泄漏内存?

c - qsort 结构数组降序

c - 使用 qsort 对结构指针数组进行排序

c - 如何防止按钮默认获得焦点