【问题标题】:Qsort a char array in cQsort c中的char数组
【发布时间】:2021-02-25 00:50:13
【问题描述】:
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 ;

我的卡片结构中有 4 个条目。例如, card[0]->name = "被妖精偷走", card[1]->name = "永恒隔离", card[2]->name = "尸骑士", card[3]->name = "欧佐夫执行者"。

qsort(cards, cardsaccum , sizeof(char), cmpname);

在我的 qsort() 中,我认为我输入了正确的参数。我的 cardaccum = 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。

我不明白为什么会发生这种情况,想知道是否有人可以帮助解释为什么会发生这种情况。下面是我的一些代码,以便更好地遵循我正在做的事情。

【问题讨论】:

  • 我不会阅读所有代码。它不可能都是相关的。相反,请向我们解释您为什么将sizeof(char) 传递给qsort。你的逻辑是什么?

标签: arrays c char qsort


【解决方案1】:
qsort(cards, cardsaccum , sizeof(char), cmpname);

cards 的类型为card_t **,因此数组的每个条目都是card_t *。它不是char 的数组。因此qsort 的第三个参数,它指定每个数组元素的大小,应该是sizeof(card_t *),而不是sizeof(char)

您也可以使用sizeof(cards[0])sizeof(*cards) 让编译器从cards 的类型中推断出类型。

【讨论】:

  • 我想补充一点,我不明白为什么在这个程序中卡片的类型是 card_t ** 而不是 card_t * (当然所有相关的东西都要重写)。节省各种不必要的分配。
  • @Cheatah:它使qsort 更高效一点,因为它的每个交换只需要交换两个指针而不是两个较大的card_t 结构。不过,可能不值得复杂性和内存开销。
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 2018-10-15
  • 2011-03-30
  • 2019-11-30
  • 1970-01-01
  • 2015-07-16
  • 2023-03-22
  • 2020-05-09
相关资源
最近更新 更多