0

次の入力ファイルがあります。

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

これは実際に私たちに与えられた仕事であり、私は数日間苦労して結果を出していません.

  • 各行を読み取り、2 番目、3 番目、4 番目の値を構造体に入れます。

  • その後、上記の 3 つの列に基づく出現回数である新しい列を追加します。

  • データを 2 番目、3 番目、4 番目で並べ替えます。そしてそれらをファイルに出力します。

これまでの私のコードは次のとおりです。

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;
}

上記の printf は最後の配列値を取得し、印刷を続けます。つまり、機能していません。誰でもこれを手伝ってください、私は提出するまで真夜中まで持っています。

4

2 に答える 2

5
cars[carCounter].CarMake = car.CarMake;

この行が問題です。C では、代入演算子を使用して単純に文字列のコピーを作成することはできません。文字列に新しいバッファを割り当ててコピーする必要があります。

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

strdup使用しているプラ​​ットフォーム/コンパイラに応じて、基本的にまったく同じことを行う関数を使用できます。

cars[carCounter].CarMake = strdup(car.CarMake);

free終わったときの思い出を忘れないでください。

編集:

ユーザー入力からファイル名を取得することには、別の問題があります。この行char fileName[] = "";には実際のテキストを入れる余地がありません - のようなものを試してくださいchar fileName[100];。現在は機能していても、引き続き機能することは保証されていません。未定義の動作に頼るのは決して安全ではありません。

于 2013-09-29T17:27:18.180 に答える