【问题标题】:Sorting structs in C with qsort使用 qsort 对 C 中的结构进行排序
【发布时间】:2013-05-05 10:15:37
【问题描述】:

我在 C 中有一个这样的结构:

typedef struct proces {
    char ime[60];
    char pid[60];
    char ppid[60];
    char stanje;
    int stdat;
    char niti[60];
    char poraba[60];
} proces ;

我创建了大约 100 个并将它们放入一个数组中

proces** procesi = malloc(sizeof(proces));
int x;
for(x=0; x<st; x++){
    procesi[x] = (struct proces*)malloc(sizeof(proces));
}

现在我想用 qsort 对它们进行排序。但是 qsort 排序错误。 函数如下所示:

int compar_ppid(const void *v1, const void *v2){
   const proces *p1 = (proces*)v1;
   const proces *p2 = (proces*)v2;
   return(strcmp(p1->ppid, p2->ppid));
}

我检查了 compar_ppid 正在比较的值,它们似乎类似于 �#d,但它们应该是数字。

我想我访问的是指针而不是值,但我不知道要更改什么才能获得正确的值。

Qsort 调用:

qsort(procesi, st, sizeof(proces*), compar_name);

【问题讨论】:

  • proces** procesi = malloc(sizeof(proces));--->proces** procesi = malloc(st*sizeof(proces*));

标签: c struct qsort


【解决方案1】:

您排序的数组包含指向process 的指针,因此您的比较函数应如下所示:

int compar_ppid(const void * v1, const void * v2)
{
    process *const*p1 = v1, *const*p2 = v2;
    return strcmp((*p1)->ppid, (*p2)->ppid);
}

正如 BLUEPIXY 指出的那样,数组的分配不是使用指针大小,而是使用结构体大小。

【讨论】:

  • 它现在可以工作,但我收到一个警告:警告:初始化从指针目标类型中丢弃'const'限定符[默认启用]
  • 我的错。修复了示例。我自己几乎从不使用const,被高估了。
猜你喜欢
  • 2021-07-16
  • 2014-05-21
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多