使用结构来比较字符串

时间:2015-02-15 19:08:23

标签: c

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错误。

1 个答案:

答案 0 :(得分:0)

您的makemodel成员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 *

考虑到您可能拥有的数据量,这是一种非常合理的方法。但是,学习良好的动态内存管理技术以实现可伸缩性是很好的。