对指向另一个结构内部结构的指针数组进行排序
Sorting an array of pointers to struct inside another struct
我有两个结构,
第一个看起来像这样:
typedef struct plant
{
char ID[10];
char scientific_name[MAX_NAME];
char **alias;
int n_alias;
int n_seeds;
} plant;
而第二个本质上是一个成员数组
typedef struct catalog
{
plant **plants;
long catalog_size;
/*specifies if the plants array is either sorted by ID or scientific_name*/
char ordering_method[5];
} catalog;
我尝试使用 qsort 对 catalog 中的 **plants 数组进行排序,我的函数调用如下:
int catalog_sort(catalog *c, const char *ordering_method)
{
if (!strcasecmp(ordering_method, "ID"))
qsort(c->plants, c->catalog_size, sizeof(plant *), qsortKey_ID);
else if (!strcasecmp(ordering_method, "name"))
qsort(c->plants, c->catalog_size, sizeof(plant *), qsortKey_name);
else
return -1;
return 0;
}
两个 qsortKey_ 函数的工作原理基本相同,但比较的是结构的不同元素
int qsortKey_ID(const void *a, const void *b)
{
const plant *pa = (plant *)a;
const plant *pb = (plant *)b;
/*checking to see if data is corrupted when the fuction gets called*/
printf("ID A - %s, ID B - %s, COMP: %d\n", pa->ID, pb->ID, strcmp(pa->ID, pb->ID));
return strcmp(pa->ID, pb->ID);
}
当我 运行 此代码时,qsort 无法正常工作,无法对数组进行排序,并且 valgrind falgs 在两个 qsortKey_ 函数调用的两个 strcmp 函数上都显示“无效的读取大小 1”,这与上面 prinf 打印的数据确实已损坏的事实相符,有趣的是数组本身在之后很好,只是没有正确排序。
我已经为此苦苦挣扎了一段时间但无济于事,因此欢迎任何意见。这不是 qort 的正确应用吗?我应该求助于手动实现排序算法吗?
您缺少一个间接寻址。
比较函数有两个指向数组元素的参数,因此:
int qsortKey_ID(const void *a, const void *b)
{
const plant *pa = *(plant **)a; // a == &plants[some index]
const plant *pb = *(plant **)b; // b == &plants[some other index]
/*checking to see if data is corrupted when the fuction gets called*/
printf("ID A - %s, ID B - %s, COMP: %d\n", pa->ID, pb->ID, strcmp(pa->ID, pb->ID));
return strcmp(pa->ID, pb->ID);
}
注意额外的星号。
我有两个结构, 第一个看起来像这样:
typedef struct plant
{
char ID[10];
char scientific_name[MAX_NAME];
char **alias;
int n_alias;
int n_seeds;
} plant;
而第二个本质上是一个成员数组
typedef struct catalog
{
plant **plants;
long catalog_size;
/*specifies if the plants array is either sorted by ID or scientific_name*/
char ordering_method[5];
} catalog;
我尝试使用 qsort 对 catalog 中的 **plants 数组进行排序,我的函数调用如下:
int catalog_sort(catalog *c, const char *ordering_method)
{
if (!strcasecmp(ordering_method, "ID"))
qsort(c->plants, c->catalog_size, sizeof(plant *), qsortKey_ID);
else if (!strcasecmp(ordering_method, "name"))
qsort(c->plants, c->catalog_size, sizeof(plant *), qsortKey_name);
else
return -1;
return 0;
}
两个 qsortKey_ 函数的工作原理基本相同,但比较的是结构的不同元素
int qsortKey_ID(const void *a, const void *b)
{
const plant *pa = (plant *)a;
const plant *pb = (plant *)b;
/*checking to see if data is corrupted when the fuction gets called*/
printf("ID A - %s, ID B - %s, COMP: %d\n", pa->ID, pb->ID, strcmp(pa->ID, pb->ID));
return strcmp(pa->ID, pb->ID);
}
当我 运行 此代码时,qsort 无法正常工作,无法对数组进行排序,并且 valgrind falgs 在两个 qsortKey_ 函数调用的两个 strcmp 函数上都显示“无效的读取大小 1”,这与上面 prinf 打印的数据确实已损坏的事实相符,有趣的是数组本身在之后很好,只是没有正确排序。
我已经为此苦苦挣扎了一段时间但无济于事,因此欢迎任何意见。这不是 qort 的正确应用吗?我应该求助于手动实现排序算法吗?
您缺少一个间接寻址。
比较函数有两个指向数组元素的参数,因此:
int qsortKey_ID(const void *a, const void *b)
{
const plant *pa = *(plant **)a; // a == &plants[some index]
const plant *pb = *(plant **)b; // b == &plants[some other index]
/*checking to see if data is corrupted when the fuction gets called*/
printf("ID A - %s, ID B - %s, COMP: %d\n", pa->ID, pb->ID, strcmp(pa->ID, pb->ID));
return strcmp(pa->ID, pb->ID);
}
注意额外的星号。