typdef struct{
int year;
char* make;
char* model;
int miles;
}Car;
int equals(Car* car, int year, char* make, char* model)
{
if(strcmp(car->make,make)==0 && strcmp(car->model,model==0))
{
return 1;
}
return 0;
}
void drive_cars(Car *garage, int* num_cars,char* driving_records)
{
int i,size1,j,k;
FILE* file=fopen(driving_records,"r");
fscanf(file,"%d",&size1);
Car update[size1];
for(i=0;i<size1;i++)
{
fscanf(file,"%d%s%s%d",&update[i].year,&update[i].make,&update[i].model,&update[i].miles);
}
for(j=0;j<*num_cars;j++)
{
for(k=0;k<size1;k++)
{
if(equals(&garage[j],update[k].year,update[k].make,update[k].model)==1)
{
garage[j].miles=garage[j].miles+update[k].miles;
}
}
}
fclose(file);
}
void store_car_statistics(Car* garage, int num_cars, char* outFile)
{
int i;
FILE* file=fopen(outFile,"w");
for(i=0;i<num_cars;i++)
{
fprintf(file,"%d %s %s %d\n",garage[i].year,garage[i].make,garage[i] .model,garage[i].miles);
}
fclose(file);
}
此代码用于将年份,品牌和型号与包含汽车年品牌和型号数组的结构进行比较。该函数传递一个Car结构的地址,一年来自包含更新信息的不同结构,具有不同品牌的结构的地址,以及具有不同模型的结构的地址。然后如果它们相等,则用更改来更新里程。但是,当我尝试运行代码时,我不断遇到seg错误。
答案 0 :(得分:0)
您的make
和model
成员char *
并且在您尝试fscanf
他们时尚未分配。即update[i].make
和{{ 1}}是update[i].model
的未定义指针。您需要使用char
分配它们。请注意,您需要为字符串终止空值,因此malloc
:
例如:
+ 1
并且不要使用for(i=0;i<size1;i++)
{
update[i].make = malloc(<size of the make string you need + 1>);
update[i].model = malloc(<size of the model string you need + 1>);
fscanf(file, "%d%s%s%d", &update[i].year, update[i].make, update[i].model, &update[i].miles);
}
的{{1}}项的地址(这是指针的地址),如上所示。
正如Peter Schneider在评论中指出的那样,您也可以使用静态分配的成员定义&
:
char *
考虑到您可能拥有的数据量,这是一种非常合理的方法。但是,学习良好的动态内存管理技术以实现可伸缩性是很好的。