首页 > 解决方案 > 如何按 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......所以,排序然后把空白值放在最后。

我在这个问题上苦苦挣扎了好几个小时......所以任何帮助表示赞赏。

标签: c

解决方案


如果您希望空字段最后出现,您可以修改比较函数,使它们比较大于非空字段:

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);
}

推荐阅读