为 qsort 编写比较函数

发布于 2024-11-27 09:41:04 字数 1379 浏览 3 评论 0原文

我正在编写一个比较函数,该函数通过姓氏的升序来比较和组织名称,如果两个姓氏相同,则按名字的降序排列。我现在拥有的功能不会这样做。

这是函数:

int namecmp(const void *p, const void *q)
{
    const name *pp = p;
    const name *qq = q;
    int n;

    if((n = strcmp(pp->last, qq->last)) != 0)
        return n;

    return qq->first - pp->first;
}

我正在尝试组织一个动态结构数组,这是我的结构。

typedef struct
{
char last[NAMESIZE];
char first[NAMESIZE];
}name;

typedef struct
{
int id;
name name;
float score;
}record;

typedef struct {
record *data; /* the dynamic array */
size_t nalloc; /* number of records allocated */
size_t nused; /* number of records in use */
} record_list;

下面是 qsort 的调用方式。

qsort(list->data, list->nused, sizeof(list->data[0]), namecmp);

任何帮助将不胜感激。

编辑:我按照你的建议做了,现在我有错误的输出。

我的输出是:

3456789 Burns, Monty: 100.00
4567890 Simpson, Lisa: 95.00
1234567 Simpson, Homer: 35.50
6666666 Simpson, Bart: 45.00
2345678 Flanders, Ned: 99.50

编辑2:

我如何将字符串存储到结构中。

            if(sscanf(line,"%s", lastname) == 1)
        {

            if(strlen(lastname) < NAMESIZE)
            {
                lastname[0] = toupper((int)lastname[0]);
                strcpy(rec->name.last, lastname);
                break;
            }
        }

I'm writing a comparision function that compares and organizes names by ascending order of last name and if both last names are the same, descending order of first names. The function I have right now will not do that.

Here is the function:

int namecmp(const void *p, const void *q)
{
    const name *pp = p;
    const name *qq = q;
    int n;

    if((n = strcmp(pp->last, qq->last)) != 0)
        return n;

    return qq->first - pp->first;
}

I am trying to organize a dynamic array of structures, here are my structures.

typedef struct
{
char last[NAMESIZE];
char first[NAMESIZE];
}name;

typedef struct
{
int id;
name name;
float score;
}record;

typedef struct {
record *data; /* the dynamic array */
size_t nalloc; /* number of records allocated */
size_t nused; /* number of records in use */
} record_list;

and here is how qsort is called.

qsort(list->data, list->nused, sizeof(list->data[0]), namecmp);

Any help would be appreciated.

EDIT: I did what you suggested now i have the wrong output.

my output is:

3456789 Burns, Monty: 100.00
4567890 Simpson, Lisa: 95.00
1234567 Simpson, Homer: 35.50
6666666 Simpson, Bart: 45.00
2345678 Flanders, Ned: 99.50

EDIT 2:

How i store string into the structure.

            if(sscanf(line,"%s", lastname) == 1)
        {

            if(strlen(lastname) < NAMESIZE)
            {
                lastname[0] = toupper((int)lastname[0]);
                strcpy(rec->name.last, lastname);
                break;
            }
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧伤还要旧人安 2024-12-04 09:41:04

您还需要对名字调用 strcmp ,否则这将不起作用(因为这只是减去内存中的地址)。将最后一行更改为

return strcmp(pp->first, qq->first);

You need to call strcmp on the first name as well or this will not work (as that's just subtracting addresses in memory). Change the last line to

return strcmp(pp->first, qq->first);
烟凡古楼 2024-12-04 09:41:04

比较函数有两个比较(已编辑的一个),但顺序不同。
首先有 strcmp(p, q) 和 return 语句有 strcmp(q,p)。让它们相同,它就会起作用!

沙什

The comparison function has two comparisons (Edited one), but in different order.
First has strcmp(p, q) and return statement has strcmp(q,p). Make them same, and it ll work !!

Shash

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文