gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:05:42 25 4
gpt4 key购买 nike

所以我正在使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com