Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何对结构数组进行qsort排序_C_Arrays_Sorting_Struct_Qsort - Fatal编程技术网

C 如何对结构数组进行qsort排序

C 如何对结构数组进行qsort排序,c,arrays,sorting,struct,qsort,C,Arrays,Sorting,Struct,Qsort,因此,我的任务是获取一个二进制文件,将其读入由结构组成的数组,然后根据结构中的数组对其进行排序。我被困的部分是分类。我不确定是应该将其作为数组进行排序(因为二进制文件现在是数组)还是作为结构进行排序。下面是我的部分代码 typedef struct { char FlightNumber[7]; char OriginCode [5]; char DestinationCode [5]; int Date []; } FLIGHT; int main(){ F

因此,我的任务是获取一个二进制文件,将其读入由结构组成的数组,然后根据结构中的数组对其进行排序。我被困的部分是分类。我不确定是应该将其作为数组进行排序(因为二进制文件现在是数组)还是作为结构进行排序。下面是我的部分代码

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 );
}
}
typedef结构{
char FlightNumber[7];
字符源代码[5];
char DestinationCode[5];
国际日期[];
}飞行;
int main(){
飞行数据[3000];
/*打开文件,将其放入数组中,然后关闭*/
/*尝试根据原始代码对其进行排序*/
整数比较(常数飞行*a,常数飞行*b){
航班*ia=(航班*)a;
航班*ib=(航班*)b;
返回strcmp(ia->OriginCode,ib->OriginCode);}
qsort(航班数据,3000,航班大小,比较);
/*要查看排序是否有效*/
对于(i=0;i<100;i++){
printf(“%i)%s,%s,%s\n”,i,FlightData[i]。FlightNumber,FlightData[i]。源代码,FlightData[i]。DestinationCode);
}
}

基本上,我不知道如何编写比较。

请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为

qsort比较函数必须具有以下类型:

int compare(const void *a, const void *b)

只要你改变你的函数签名来匹配它,你的比较器就会工作

请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为

qsort比较函数必须具有以下类型:

int compare(const void *a, const void *b)

只要你改变你的函数签名来匹配它,你的比较器就会工作

请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为

qsort比较函数必须具有以下类型:

int compare(const void *a, const void *b)

只要你改变你的函数签名来匹配它,你的比较器就会工作

请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为

qsort比较函数必须具有以下类型:

int compare(const void *a, const void *b)

只要你改变你的函数签名来匹配它,你的比较器就会工作

首先,比较器函数应具有签名:

int compare(const void *v1, const void *v2);
接下来,将空心指针转换为结构指针:

    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,您真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来给出时间和日期。剩下的问题是一天出发另一天到达的航班——通宵航班和跨越国际日期线的航班。实际上,你可能需要一个出发时间和一个到达时间

另请参见(毫无疑问,除其他外):


首先,比较器功能应具有以下特征:

int compare(const void *v1, const void *v2);
接下来,将空心指针转换为结构指针:

    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,您真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来给出时间和日期。剩下的问题是一天出发另一天到达的航班——通宵航班和跨越国际日期线的航班。实际上,你可能需要一个出发时间和一个到达时间

另请参见(毫无疑问,除其他外):


首先,比较器功能应具有以下特征:

int compare(const void *v1, const void *v2);
接下来,将空心指针转换为结构指针:

    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,您真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来给出时间和日期。剩下的问题是一天出发另一天到达的航班——通宵航班和跨越国际日期线的航班。实际上,你可能需要一个出发时间和一个到达时间

另见(除其他外,无d