【问题标题】:Passing parameters to qsort() function from <stdlib.h>从 <stdlib.h> 将参数传递给 qsort() 函数
【发布时间】:2016-04-01 05:12:43
【问题描述】:

这是我声明的数据类型:

struct Element{
    char name[21], symbol[4];
    double atomicMass;
    int valence;
};
typedef struct Element myElements;
myElements data[20];

如果我只想传递成员的名字

data[20] 

到qsort(),怎么做?

不确定这是否是传递给函数的正确方法:

qsort(data->name, 20, sizeof(myElements), compare);

【问题讨论】:

  • 您想按名称的字母顺序对data 进行排序吗?
  • 是的,按字母顺序排列。
  • “怎么做?” ——你不这样做,也不想这样做。您要做的是根据名称对数据进行排序。如果您真的只想将名称传递给 qsort,则必须将它们复制到仅包含名称的数组中。
  • typedef struct Element myElements; -- 如果您正在参加 C 混淆竞赛,这是一件好事。否则应该是typedef struct Element Element;

标签: c data-structures std qsort


【解决方案1】:

你不只是通过成员。正确的方法是编写一个辅助比较函数,通过名称比较两个元素并使用它。

static int
cmpElement(const void *p1, const void *p2)
{
    return strcmp(((const Element *) p1)->name, ((const Element *) p2)->name);
}

qsort(data, 20, sizeof data[0], cmpElement);

【讨论】:

  • 不应该是 sizeof(myElements) 而不是 sizeof(Element)
  • @SadmanAhmed 不,sizeof(struct Element) 或 sizeof(data[0]) 是正确的; sizeof(myElements) 是非常错误的。尝试阅读 qsort 文档。
  • @JimBalter 有什么不同?
  • @JimBalter: typedef struct Element myElements;
  • 啊,你是对的,但我有理由认为 myElements 是一个数组,而不是单个元素的类型。这个名字太可怕了。
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 2013-01-27
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多