如何sorting在C中的结构数组?

我有一个以下结构的数组

typedef struct _my_data_ { unsigned int id; double latitude; double longitude; unsigned int content_len; char* name_dyn; char* descr_dyn; } mydata; 

并想按ID升序排列。 我读它是可能的使用qsort函数sorting数组,但我不知道如何正确使用它时sorting结构。

任何帮助,将不胜感激。

你需要一个结构比较函数来匹配qsort()期望的函数原型,即:

 int md_comparator(const void *v1, const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; if (p1->id < p2->id) return -1; else if (p1->id > p2->id) return +1; else return 0; } 

如果您遇到更复杂的sorting标准,这仍然是一个很好的基础,因为您可以使用相同的框架添加次级标准:

 int md_comparator(const void *v1, const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; if (p1->latitude < p2->latitude) return -1; else if (p1->latitude > p2->latitude) return +1; else if (p1->longitude < p2->longitude) return -1; else if (p1->longitude > p2->longitude) return +1; else return 0; } 

显然,这需要重复尽可能多的标准。 如果您需要调用函数( strcmp() ?)来比较值,请调用它一次,但将返回值分配给本地variables并使用两次:

 int md_comparator(const void *v1, const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; int rc; if (p1->latitude < p2->latitude) return -1; else if (p1->latitude > p2->latitude) return +1; else if (p1->longitude < p2->longitude) return -1; else if (p1->longitude > p2->longitude) return +1; else if ((rc = strcmp(p1->name_dyn, p2->name_dyn)) < 0) return -1; else if (rc > 0) return +1; else return 0; } 

而且,这个模板在数据成员是无符号整数时有效,并且避免了在比较有符号整数时的溢出问题。 请注意,您可能会看到的捷径,即:

 int md_comparator(const void *v1, const void *v2) /* BAD */ { /* BAD */ const mydata *p1 = (mydata *)v1; /* BAD */ const mydata *p2 = (mydata *)v2; /* BAD */ return(p1->id - p2->id); /* BAD */ } /* BAD */ 

如果id是无符号的(两个无符号整数的差别永远不是负数),那么这个结果是不好的,如果整数是有符号的,并且数量级大而符号相反,那么就会发生溢出。