提问人:csDreamer 提问时间:3/7/2021 最后编辑:csDreamer 更新时间:3/7/2021 访问量:111
结构体的 Qsort 数组
Qsort array of structs
问:
我有一个结构数组,我要将条目添加到其中
typedef struct card
{
char* name;
} card_t;
这些是文件中的名字:被妖精偷走、永恒隔离、尸体骑士、奥尔佐夫执法者
我有一个 qsort 函数,它应该按字母顺序对所有条目进行排序。但是,它不起作用。
// FUNCTION FOR QSORT()
int cmpname (const void *pa, const void *pb) {
const card_t **p1 = pa;
const card_t **p2 = pb;
return strcmp((*p1(->name, (*p2)->name);
}
#include "card.h"
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
// FUNCTION FOR QSORT()
int cmpname (const void *pa, const void *pb) {
const card_t *p1 = pa;
const card_t *p2 = pb;
return strcmp(p1->name, p2->name);
}
int main(int argc, char **argv) {
char *buf = NULL;
size_t bufsiz = 0;
FILE *input_file;
if((input_file = fopen(argv[1], "r")))
{
ssize_t result = getline(&buf, &bufsiz, input_file);
int num_entries = 1;
card_t **cards = NULL;
int i = 0;
int cardsaccum = 0;
int id;
char *name_duplicate;
// GETS LINE FROM THE CSV FILE
result = getline(&buf, &bufsiz, input_file);
// WHILE THE FILE STILL HAS TEXT
while (result > 0)
{ // COPIES BUFFER TO SAVE THE MEMORY ADDRESS
char *stringp = buf;
// ALLOCATES MEMORY
cards = realloc(cards, sizeof(card_t *) * num_entries);
cards[cardsaccum] = malloc(sizeof(card_t));
cards[cardsaccum]->name = strsep(&stringp, "\"");
cardsaccum++;
num_entries++;
// MUST NULL THE BUFFER BEFORE GETLINE
buf = NULL;
// NEXT LINE
result = getline(&buf, &bufsiz, input_file);
if(result == -1)
{
qsort(cards, cardsaccum - 1, sizeof(student_t *), cmpname);
//printf("AFTER QSORT \n");
//printf("\n");
for(i = 0; i < cardsaccum;i++)
{
printf("%s", cards[i]->name);
}
}
}
for(i=0; i < cardsaccum;i++)
{
free(cards[i]);
}
free(cards);
free(buf);
fclose(input_file);
return 0;
}
else
{
fprintf(stderr, "./parser: cannot open(%s%s%s): No such file or directory\n", "\"", argv[1], "\"");
return 1;
}
}
我的输出是:
Corpse Knight
Eternal isolation
Stolen by the Fae
Orzhov Enforcer
如果我的 qsort 函数正确,那么应该切换 Fae 和 Orzhov Enforcer 的 Stolen by the Fae。任何建议将不胜感激。
答:
1赞
selbie
3/7/2021
#1
关于指针服从的其他答案是正确的。
但是,为什么要传入而不是实际的元素数量?length-1
qsort(cards, cardsaccum - 1, sizeof(char *), cmpname);
应该是:
qsort(cards, cardsaccum, sizeof(cards[0]), cmpname);
0赞
Some programmer dude
3/7/2021
#2
qsort
函数将指向元素的指针映射到比较函数。
从本质上讲,它像 .cmpname
cmpname(&cards[i], &cards[j])
当数组中的每个元素都是指针时,指向它的指针就是指向指针的指针。这意味着变量,并且在函数中不正确,从而导致未定义的行为。p1
p2
您需要使用正确的类型:
// FUNCTION FOR QSORT()
int cmpname (const void *pa, const void *pb) {
const card_t **p1 = pa; // These are pointer to the elements, and since each
const card_t **p2 = pb; // element is a pointer then these becomes pointers to pointers
return strcmp((*p1)->name, (*p2)->name); // Remember to dereference the pointers
}
您还有其他一些问题,例如元素数参数实际上应该是数组中的元素数,而不是顶部索引。为什么使用元素大小?qsort
sizeof(char *)
评论
0赞
csDreamer
3/7/2021
感谢您对 qsort 的解释!
下一个:指针,结构 C
评论