c - 如何按 char 字段对结构数组进行排序,以便空字段排在最后?
问题描述
我有一个结构:
struct StructA{
char name[TEXT_LEN];
int year;
};
typedef struct StructA Data_t;
可以说它可以是这样的:
Name: A
Year: 2002
Name:
Year: 2003
Name: C
Year: 2003
Name: B
Year: 2004
Name:
Year: 2005
现在我想对它进行排序,它首先对现有值进行排序,然后将空值放在最后。为此,我使用qsort()
:
int compareDataT(const void *v1, const void *v2)
{
const Data_t *u1 = v1;
const Data_t *u2 = v2;
return strcmp(u1->name, u2->name);
}
qsort(items, length, sizeof(Data_t), compareDataT);
这给了我:
Name:
Year: 2003
Name:
Year: 2005
Name: A
Year: 2002
Name: B
Year: 2004
Name: C
Year: 2003
如果我在功能上反转它,那么它会给我C, B, A, blank, blank
......
我想把它当作A, B, C, blank, blank
......所以,排序然后把空白值放在最后。
我在这个问题上苦苦挣扎了好几个小时......所以任何帮助表示赞赏。
解决方案
如果您希望空字段最后出现,您可以修改比较函数,使它们比较大于非空字段:
int compareDataT(const void *v1, const void *v2) {
const Data_t *u1 = v1;
const Data_t *u2 = v2;
if (*u1->name == '\0')
return (*u2->name == '\0') ? 0 : 1;
if (*u2->name == '\0')
return -1;
return strcmp(u1->name, u2->name);
}
推荐阅读
- ruby-on-rails - Ruby on Rails 动态上一个/下一个按钮
- git - 通过 n 次提交更新 git 子模块
- python - 按小时计算大型数据集的时间平均值
- facebook - 如何从 Shopify 商店中删除这些 Facebook 像素?
- html - How can I re-order
- based on screen size (bootstrap 4)
- java - Morphia 没有对我的索引应用稀疏选项
- nginx - 基于标头值的 Nginx 转发代理
- linux - 使用 awk 计算特定列在文件中出现的次数
- r - 附加到R中列表的多个元素
- python - 是否可以为 scikit-learn 集成分类器设置“阈值”?