1

わかりましたので、以下のコードがあり、ファイルからさまざまなものを引き出して構造体の配列に入力しているだけです。最初は「一見」機能しますが、ファイルの処理が完了した後に印刷すると、すべてのコースと名前を最後の値に置き換えましたが、奇妙なことに、これは整数 (成績) では発生しません。成績は適切に入力されます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student {
    char *name;
    char *course;
    int grade;

};

void courseSort(struct student d[20], int size);

int main(void)
{
    FILE* fp;
    char* filename = "grades.csv";
    char buffer[100];
    char* name, *class;
    char* del=",";
    int grade, i, counter=0;

    struct student d[20];

    if((fp=fopen(filename, "r"))==NULL)
    {
        printf("unable to open %s\n", filename);
        exit(1);
    }

    while(fgets(buffer, sizeof(buffer), fp) !=NULL)
    {
        name = strtok(buffer,del);
        class=strtok(NULL,del);
        grade = atoi(strtok(NULL,del));

        d[counter].name=name;
        d[counter].course=class;
        d[counter].grade=grade;
        printf("%s    %s       %d\n",d[counter].name,d[counter].course,d[counter].grade);
        counter++;
    }

    printf("\n\n\n");

    for(i=0;i<counter;i++)
        printf("%s    %s     %d\n",d[i].name,d[i].course,d[i].grade);
    courseSort(d,counter);

    fclose(fp);
 }

何が間違っているのかわかりません:(すべてが簡単に思えますが、なぜすべてを最新のものに置き換えるのかわかりません。

4

3 に答える 3

1

これは、ポインターと char 配列 (文字列) の単純な誤解です。それらをかなりよく説明しているいくつかのページを次に示します。

あなたの場合、構造体ポインターの値をstrtokから返されたポインターに等しく設定しています。これらの文字列関数の多くは、結果を特定のメモリ アドレスに置き、そこへのポインタを返すことによって機能します。返されるポインターは常に同じであるため、すべての構造体値は strtok 呼び出しの最後の結果を指します。

これが、 strdup (文字列の複製)が必要な理由です。基本的に、指定されたアドレスの値を取得し、その内容をメモリ内の新しい場所にコピーして、値を返します。

于 2013-07-13T21:29:57.620 に答える
1

エラーはここにあります。

d[counter].name=name;

と置換する:

d[counter].name = strdup(name); /*don't forget to free this memory.*/

コースの問題は同じです。

于 2013-07-13T21:20:26.617 に答える