4

かなり基本的なコードで問題が発生しています。以下に示すファイルから各行を読み取り、strtok を使用して 3 つの部分に分割し、各部分を配列に格納する必要があります。「ゴール」と「アシスト」の配列は完全に機能していますが、何らかの理由で名前配列全体がファイルから読み取った姓で埋められています。

入力ファイル:

Redden 2 0
Berglund 5 2
Jackman 2 0
Stewart 4 0
Oshie 3 5
McDonald 2 4
Pietrangelo 2 7
Perron 2 6
Tarasenko 5 5

関連コード:

int main(int argc, char* argv){  
    FILE* inFile = fopen(argv[1],"r");
    char ** nameArray;
    int * goalArray;
    int * assistArray;
    int size = countLinesInFile(inFile);
    allocateMemory(&goalArray, &assistArray, &nameArray, size);
    readLinesFromFile(inFile, goalArray, assistArray, nameArray, size);
}

void allocateMemory(int** goals, int** assists, char*** names, int size)
{
  *goals = malloc(size*sizeof(int));
  *assists = malloc(size*sizeof(int));
  *names = malloc(size*sizeof(char *));
  int i;
  for(i=0; i<size; i++)
  {
    *(*names + i) = calloc(MAX_NAME,sizeof(char));
  }
}

void readLinesFromFile(FILE* fPtr, int* goals, int* assists, char** names, int numLines)
{
  int i;
  char * buffer = malloc(MAX_LINE*sizeof(char));
  for(i = 0; i<numLines; i++)
  {
    if(fgets(buffer, MAX_LINE, fPtr)!= NULL)
    {
      names[i] = strtok(buffer, " \n");
      goals[i] = atoi(strtok(NULL, " \n"));
      assists[i] = atoi(strtok(NULL, " \n"));
    }
  }
}

なんらかの理由で、nameArray[0-9] にはすべて「たらせんこ」が含まれています。

4

2 に答える 2

1

名前をコピーしませんでした。返されたポインターstrtokをデータ構造に入れただけです。が指す同じメモリへの同一のポインタでいっぱいのデータ構造になってしまいますbuffer。の内容はbufferループを通過するたびに変更されるため、最後に通過したものへのポインターの束ができてしまいます。

于 2013-02-22T21:08:07.700 に答える
1

strtok次のトークンを含む null で終わる文字列へのポインタを返します。このトークンを実際にコピーするには、次を使用する必要がありますstrcpy

strcpy(names[i],    strtok(buffer,      " \n"));
strcpy(goals[i],    atoi(strtok(NULL,   " \n")));
strcpy(assists[i],  atoi(strtok(NULL,   " \n")));

また、コードにメモリ リークがあることにも注意してください。

void readLinesFromFile(/*...*/)
{
    char * buffer = malloc(MAX_LINE*sizeof(char));
    // ...
    fgets(buffer, MAX_LINE, fPtr);
    // ...
}

bufferを呼び出して動的に割り当てmallocますが、このメモリは解放しません。free()によって割り当てられたメモリを指すポインターを呼び出すことを忘れないでくださいmalloc。ただし、この場合は、自動保存期間を備えた配列の方が適しています。

void readLinesFromFile(/*...*/)
{
    char buffer[MAX_LINE];
    // ...
    fgets(&buffer, MAX_LINE, fPtr);
    // ...
}
于 2013-02-22T21:18:41.813 に答える