0

私はこの構造体を持っています:

struct match {
    int round;
    int day, month, year;
    int hour, minutes;
    char *home_team;
    char *visitor_team;
    int home_score;
    int visitor_score;
    int number_of_spectators;
};

そして、ファイルからいくつかの値をロードするこの関数があります。

struct match matches[198];

int get_matches_from_file(struct match *matches)

そして、forループでこれを使用して値を設定します:

int year, month, day, hour, minute;
int m_round;
int home_score, visitor_score;
char home[3], visitor[3];
int spectators;

sscanf(line[i], "%d %d.%d.%d kl.%d.%d %s - %s %d - %d %d", &m_round, &day, &month, &year, &hour, &minute, home, visitor, &home_score, &visitor_score, &spectators);

matches[i].round = m_round;
matches[i].day = day;
matches[i].month = month;
matches[i].year = year;
matches[i].hour = hour;
matches[i].minutes = minute;
matches[i].home_team = home;
matches[i].visitor_team = visitor;
matches[i].home_score = home_score;
matches[i].visitor_score = visitor_score;
matches[i].number_of_spectators = spectators;

しかし、構造体を印刷すると。すべてhome_teamvisitor_team文字列は、ロードしたファイルの最後の文字列と同じです。ループの最後ですべて変更されたかのように。

これはline[]配列の最後の行の例です

33 23.05.2012 kl. 20.00 AGF - FCM 0 - 2 12.139

すべてhome_teamandは andvisitor_teamに設定されAGFますFCM

4

1 に答える 1

5

charhome_teamとvisitor_teamに1つだけ割り当てました。構造体でchar配列を使用して、文字列用のスペースを提供します。

#define MAX_NAME_BYTES(32) /* include space for nul terminator */
struct match {
    int round;
    int day, month, year;
    int hour, minutes;
    char home_team[MAX_NAME_BYTES];
    char visitor_team[MAX_NAME_BYTES];
    int home_score;
    int visitor_score;
    int number_of_spectators;
};

次に、を使用strcpyして結果を構造体にコピーします。

strcpy(matches[i].home_team, home);
strcpy(matches[i].visitor_team, visitor);

または、構造体でcharポインターを使用し(編集した質問で使用するように)、次を使用してそれらを割り当てますstrdup

matches[i].home_team = strdup(home);
matches[i].visitor_team = strdup(visitor);

構造体を破棄するときは、これらの文字列を解放する必要があることに注意してください。

free(matches[i].home_team);
free(matches[i].visitor_team);
于 2012-11-21T14:55:19.783 に答える