将输入文件读入struct并对数据进行排序?

ykh*_*ykh 0 c struct

我有以下输入文件:

WO98EKOYMPCAUEWT0 Honda Civic 2011 4
7W32UAERZFBCB3S6P Chevrolet Tahoe 2011 6
DNU7XQO8LLA9I6YFX Toyota Tercel 2012 4
DNU7XQO8LLA9I6YFX Toyota Tercel 2012 4
DNU7XQO8LLA9I6YFX Toyota Tercel 2012 4
7W32UAERZFBCB3S6P Chevrolet Tahoe 2011 6
Run Code Online (Sandbox Code Playgroud)

这实际上是我们交给的一项任务,我一直在苦苦挣扎几天没有结果.

  • 读取每一行并将第二个,第三个和第四个的值放在结构中.

  • 之后添加一个新列,它是基于上面3列的出现次数.

  • 按秒,第三和第四排序数据.然后将它们输出到一个文件中.

到目前为止,这是我的代码:

struct Car
{
       char *CarMake;
       char *CarModel;
       char *CarMakeYear;
       int Occurances;
};

int main(int argc, char *argv[])
{
  //File related
  FILE *inputFile, *outputFile; 
  char fileName[] = "";

  //Struct related
  int carCounter = 0;
  struct Car cars[50];

  struct Car car;
  car.CarMake  = (char*)malloc( 200 *sizeof(char));
  car.CarMakeYear  = (char*)malloc( 200 *sizeof(char));
  car.CarModel  = (char*)malloc( 200 *sizeof(char));
  car.Occurances = 0;  

  printf("Please enter file name:",  fileName);
  scanf("%s",fileName);
  inputFile = fopen(fileName,"r"); 

  while(fscanf(inputFile, "%*s %s %s %s %*s\n",car.CarMake, car.CarModel,car.CarMakeYear ) != EOF)
  {         
   cars[carCounter].CarMake = car.CarMake;                     
    carCounter++;
  }
  fclose(inputFile);

  int i=0;
  for(i=0;i<6;i++)
   printf("%s %s %s \n", cars[i].CarMake, cars[i].CarModel,cars[i].CarMakeYear);

  system("PAUSE");  
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的printf将采用最后一个数组值并保持打印,这意味着它无法正常工作.有人请帮忙,我要到午夜才提交.

Dre*_*wen 5

cars[carCounter].CarMake = car.CarMake;
Run Code Online (Sandbox Code Playgroud)

这条线就是问题所在.在C中,您不能简单地使用赋值运算符复制字符串.您必须为字符串分配一个新缓冲区并将其复制:

cars[carCounter].CarMake = malloc(strlen(car.CarMake) + 1); // plus one to include the null-terminator
strcpy(cars[carCounter].CarMake, car.carMake);
Run Code Online (Sandbox Code Playgroud)

根据您正在使用的平台/编译器,您可以使用该strdup函数,该函数基本上完全相同:

cars[carCounter].CarMake = strdup(car.CarMake);
Run Code Online (Sandbox Code Playgroud)

完成后不要忘记free记忆.

编辑:

从用户输入中获取文件名还有另一个问题.该行char fileName[] = "";不会为实际文本留下任何空间 - 尝试类似的东西char fileName[100];.即使现在有效,也不能保证继续工作; 这是从来没有的安全依赖于不确定的行为.