如何在C中定义嵌套结构数组?
因此,我目前有2个结构,如下图所示,其中race_结果包含一系列参与比赛的船只。每个比赛可以有一条或多条船与之相关如何在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];
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中声明的