enum rarity
{
common,
uncommon,
rare,
mythic
};
struct card
{
unsigned int id;
char* name;
char* cost;
unsigned int converted_cost;
char* type;
char* text;
char* stats;
enum rarity rarity;
} card_t ;
我的card结构中有4个条目。例如,card[0]->name = "被费偷了", card[1]->name = "永恒的隔离"card[2]->name = "Corpse Knight", card[3]->name = "Orzhov Enforcer"
qsort(cards, cardsaccum , sizeof(char), cmpname);
在我的qsort()中,我认为我输入了正确的参数。我的cardsaccum = 4, sizeof(char)被设置,因为我要检查名字的大小,然后调用cmpname,它会按顺序对名字进行排序。
int cmpname (const void *pa, const void *pb) {
const card_t *p1 = pa;
const card_t *p2 = pb;
return strcmp(p1->name, p2->name);}
在qsort()之后,我的排序条目仅是最后读取的条目,即Orzhov Enforcer。
我不明白为什么会发生这种情况,想知道是否有人可以帮助解释为什么会发生这种情况。下面是我的一些代码,以便更好地了解我在做什么。
qsort(cards, cardsaccum , sizeof(char), cmpname);
cards
的类型为card_t **
,因此数组的每一项都是一个card_t *
。它不是一个char
的数组。因此,qsort
的第三个参数(指定每个数组元素的大小)应该是sizeof(card_t *)
,而不是sizeof(char)
。
您也可以使用sizeof(cards[0])
或sizeof(*cards)
来让编译器从cards
的类型推断出类型。