如何在C中定义嵌套结构数组?

如何在C中定义嵌套结构数组?,c,C,因此,我目前有2个结构,如下图所示,其中race_结果包含一系列参与比赛的船只。每个比赛可以有一条或多条船与之相关 struct boat_data { int ID; int time_to_complete_hours; int time_to_complete_mins; int time_to_complete_secs; } boat_node; typedef struct race_result { char race_date[80];

因此,我目前有2个结构,如下图所示,其中race_结果包含一系列参与比赛的船只。每个比赛可以有一条或多条船与之相关

struct boat_data {
    int ID;
    int time_to_complete_hours;
    int time_to_complete_mins;
    int time_to_complete_secs;
} boat_node;

typedef struct race_result {
    char race_date[80];
    int start_time_hours;
    int start_time_mins;
    int start_time_secs;
    int num_boats_competing;
    struct boat_data boat_data[];
} race_node;
问题是,当我稍后定义比赛中将有多少条船时(此时我不确定每次比赛将有多少条船),它将不起作用,因为它似乎只占用一条船,然后在该点之后退出嵌套for循环results\u数组是比赛结果的数组

fscanf(file, "%d", &total_races);
        for (int races = 0; races < total_races; races++) {
            fscanf(file, " %[^\n]", results_array[races].race_date);
            fscanf(file, " %d", &results_array[races].start_time_hours);
            fscanf(file, " %d", &results_array[races].start_time_mins);
            fscanf(file, " %d", &results_array[races].start_time_secs);
            boat_contenders = fscanf(file, "%d", &results_array[races].num_boats_competing);
            for (int num_boats = 0; num_boats < boat_contenders; num_boats++) {
                scan_status = fscanf(file, "%d\n%d %d %d\n", &results_array[races].boat_data[num_boats].ID,
                                     &results_array[races].boat_data[num_boats].time_to_complete_hours,
                                     &results_array[races].boat_data[num_boats].time_to_complete_mins,
                                     &results_array[races].boat_data[num_boats].time_to_complete_secs);
            }
fscanf(文件“%d”和总比赛次数);
对于(整数种族=0;种族<总种族数;种族++){
fscanf(文件“%[^\n]”,结果数组[races]。race\u日期);
fscanf(文件“%d”&结果数组[races]。开始时间(小时);
fscanf(文件“%d”和结果数组[races]。开始时间(分钟);
fscanf(文件“%d”&结果数组[races]。开始时间(秒);
船只竞争者=fscanf(文件“%d”&结果数组[races].num船只竞争者);
对于(int num_boats=0;num_boats
编辑

fscanf(file, "%d", &total_races);
        for (int races = 0; races < total_races; races++) {
            fscanf(file, " %[^\n]", results_array[races].race_date);
            fscanf(file, " %d", &results_array[races].start_time_hours);
            fscanf(file, " %d", &results_array[races].start_time_mins);
            fscanf(file, " %d", &results_array[races].start_time_secs);
            boat_contenders = fscanf(file, "%d", &results_array[races].num_boats_competing);
            for (int num_boats = 0; num_boats < boat_contenders; num_boats++) {
                scan_status = fscanf(file, "%d\n%d %d %d\n", &results_array[races].boat_data[num_boats].ID,
                                     &results_array[races].boat_data[num_boats].time_to_complete_hours,
                                     &results_array[races].boat_data[num_boats].time_to_complete_mins,
                                     &results_array[races].boat_data[num_boats].time_to_complete_secs);
            }
为船只数量[10]创建了上限,并将我的嵌套for循环更改为使用
for(int num_boots=0;num_boots

我现在遇到一个问题,即
结果\u数组
尚未初始化错误:
-var create:无法创建变量对象

它是使用
struct race\u result race\u root[total\u races];
初始化的,其中
total\u races=6
主要问题(您在问题中提到的问题)如下:

fscanf
的返回值不是读入的值,而是成功读取的值的数量。在这种情况下,由于格式字符串仅指定一个参数,因此假设读取成功,该值将始终为1。稍后将其用作for循环的边界,这意味着它将只跑一次

作为循环的边界,您应该使用
results\u array[races].num\u boats\u competing

这一行也有问题:

struct boat_data boat_data[];

首先,不要给变量赋予与类型相同的名称,即使它编译了该变量也是一个坏主意。您还需要指定此数组的大小。请考虑一些合理的上界,以确定可以参加比赛的船只数量。由于您还存储了参赛船只的实际值,因此该值是否较大并不重要han是您读取的实际船只数量。

首先,您在嵌套的For循环中使用
船只竞争者
,但我认为您应该使用
结果数组[比赛].num_boats_competing
boat_competing
存储
fscanf
函数的返回值,该函数返回一个整数,指示从文件中成功读取了多少个值,在您的示例中,该值总是
1
0
。非常感谢您发现了这个错误!关于您你的编辑:哪里是
race\u root
声明的?对不起,
race\u root
是在main.c中声明的