-1

私の課題は、スペースで区切られたファイルからデータを読み込み、データを並べ替えることです。セグ フォールトが発生し続け、自分のコードの何が問題なのかわかりません。助けてくれてありがとう。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LINE 100
#define MAX_NAME 30
int countLinesInFile(FILE* fptr);
int findPlayerByName(char **names, char* target, int size);
int findMVP(int* goals, int* assists, int size);
void printPlayers(int* goals, int* assists, char** names, int size);
void allocateMemory(int **goals, int** assists, char*** names, int size);
void sortPlayersByGoals(int* goals, int* assists, char** names, int size);
void writeToFile(FILE *fptr, int* goals, int* assists, char** names, int size);
void readLinesFromFile(FILE* fptr, int* goals, int* assists, char** names, int        numLines);

int main(int argc, char **argv)
{
    FILE *fptr;
    int size;
    int* goals;
    int* assists;
    char** names;
    if(argc != 2)
    {
            printf("Invalid number of arguments\n");
            return 1;
    }
    fptr = fopen(argv[1], "r");
    if(fptr == NULL)
    {
            printf("Failed to open input file.\n");
            return 2;
    }
    size = countLinesInFile(fptr);
    allocateMemory(&goals, &assists, &names, size);
    int numLines;
    numLines = size;
    readLinesFromFile(fptr, goals, assists, names, numLines);
    printPlayers(goals, assists, names, size);

    return 3;
}
void printPlayers(int* goals, int* assists, char** names, int size)
{
    int i;
    for(i = 0; i < size; i++)
    {
    printf("%c     %d     %d", *(names + i), *(goals + i), *(assists + i));
    }

}
void readLinesFromFile(FILE* fptr, int* goals, int* assists, char** names, int numLines)
{
    char line[MAX_LINE];
    int i;
    char* value;

    for(i = 0; i < numLines; i++)
    {
            fgets(line, MAX_LINE, fptr);
            value = strtok(line, " ");
            *(*names + i) = atoi(value);
            value = strtok(line, " ");
            *(goals + i) = atoi(value);
            value = strtok(line, " ");
            *(assists + i) = atoi(value);
    }


}
void allocateMemory(int **goals, int** assists, char*** names, int size)
{

    *goals = malloc(sizeof(int)* size);
    *assists = malloc(sizeof(int)* size);
    *names = malloc(sizeof(char*)* MAX_NAME);

}
int countLinesInFile(FILE* fptr)
{
    int i;
    char line[MAX_LINE];
    i = 0;
    while(fgets(line, MAX_LINE, fptr) != NULL)
    {
    i++;
    }
    rewind(fptr);
    return i;
}

- 入れる -

入力ファイルは次のようになります: 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

4

2 に答える 2

0

割り当てメモリ()では、それぞれ*nameschar **です。2回割り当てる必要があります

*names = malloc(...);
for (<each pointer in names>) {
    <pointer> = malloc(...);
}

2回も解放することを忘れないでください

for (<each pointer in names>) {
    free(<pointer>);
}
free(*names);
于 2013-02-20T21:44:39.283 に答える
0

セグメンテーション違反については、ポインターを逆参照しています**names*names、単一化されたポインターです。これは未定義の動作につながるため、あなたの場合は実行エラーになります(そして最悪の場合もあります!)。これを解決するには、次のように2次元配列を割り当てる必要があります。

*a = malloc(numLines * sizeof **a);
for (i = 0; i < n; i++) (*a)[i] = malloc(NAME);

さらに、あなたのstrtok利用は間違っているようです。この関数は、データへの静的ポインターを保持します(したがって、多くの場合、スレッドセーフではありません)NULL 。次の呼び出しで値を使用する必要があります。それ以外の場合は、毎回同じアドレスを返します。man strtokお気に入りのウェブ検索エンジンに入力して、ドキュメントを確認してください。

char line[MAX_LINE];
int i;

for (i = 0; i < numLines; i++)
{
    fgets(line, sizeof line, fptr);
    value = strtok(line, " ");
    (*names)[i] = atoi(value); /* This assignment looks strange. */
    value = strtok(NULL, " ");
    goals[i] = atoi(value);
    value = strtok(NULL, " ");
    assits[i] = atoi(value);
}

配列添字演算子を忘れないでください!それが実際のプログラムである場合は、sscanfより適切に見えます。

于 2013-02-20T21:46:29.797 に答える