所以我的任务是抓取一个二进制文件,将其读入由结构组成的数组中,然后根据结构中的数组对其进行排序。我坚持的部分是排序。我不确定我是否应该将其排序为数组(因为二进制文件现在是一个数组)或者将其排序为结构。下面是我的代码的一部分。
typedef struct {
char FlightNumber[7];
char OriginCode [5];
char DestinationCode [5];
int Date [];
} FLIGHT;
int main(){
FLIGHT FlightData [3000];
/*opens file, freads it into the array then closes*/
/*trying to sort it based on OriginCode*/
int compare (const FLIGHT *a, const FLIGHT *b) {
FLIGHT *ia = (FLIGHT *)a;
FLIGHT *ib = (FLIGHT *)b;
return strcmp(ia->OriginCode, ib->OriginCode);}
qsort( FlightData, 3000, sizeof( FLIGHT ), compare);
/*to see if sorting worked...*/
for (i = 0; i < 100; i++){
printf ("%i) %s, %s, %s\n", i, FlightData[i].FlightNumber, FlightData[i].OriginCode, FlightData[i].DestinationCode );
}
}
基本上我对如何写比较感到迷茫。
答案 0 :(得分:2)
请注意,此处Date
的大小为零,因为您没有为其分配任何空间。取消引用它将是未定义的行为。
qsort比较函数必须具有以下类型:
int compare(const void *a, const void *b)
只要您更改功能签名以匹配此比较器,您的比较器就应该工作。
答案 1 :(得分:1)
首先,比较器功能应具有签名:
int compare(const void *v1, const void *v2);
接下来,将void指针转换为结构指针:
const FLIGHT *ia = (FLIGHT *)v1;
const FLIGHT *ib = (FLIGHT *)v2;
接下来,您需要逐个系统地比较事物:
int rc;
if ((rc = strcmp(ia->OriginCode, ib->OriginCode)) != 0)
return rc;
if ((rc = strcmp(ia->DestinationCode, ib->DestinationCode)) != 0)
return rc;
…
return 0; // Only if the two entries compare as identical
按原点机场代码,目的地机场代码排序,然后按您可以决定的其他标准(航班号,日期)排序。我注意到您尚未指定日期的存储方式。由于它是一个整数数组(显然是一个“灵活的数组成员”),你可能会按某种顺序分别“年,月,日”。
如果您有一个灵活的数组成员,则不应该定义结构数组,因为您无法在灵活数组成员中存储任何内容。您可以拥有一组指针,但需要单独分配结构。 OTOH,你真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来提供时间和日期。剩下的问题是飞机在一天起飞并抵达另一天 - 超过国际日期线的过夜和飞行。在实践中,您可能需要出发时间和到达时间。
另见(其中许多人,毫无疑问):
答案 2 :(得分:0)
请参阅以下链接以详细了解qsort 链接:http://www.cplusplus.com/reference/cstdlib/qsort/