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

問題は、strtok から新しいトークンが取得されるたびに、構造体配列の以前の値が置き換えられることです。

問題のあるこのブロックに絞り込みました。

d[counter].name=name;
d[counter].course=class;

strtok が新しい値を返すたびに再書き込みされる同じメモリブロックを指しているように見えるため、構造体内のすべてのポインターがその1つのオブジェクトを指しています。

ここに私の構造体があります:

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

};

今私の質問は、strtok 値を別のメモリ アドレスに配置して、すべてが 1 つの場所だけを指して自分自身を置き換えないようにする方法はありますか?

Strdup、malloc、および memmove は私にとって選択肢ではありません。

何が起こっているかをより明確に表現するために、ここに予想される大まかな出力があります

Tom    Phys 1444   54
Joe    CSE 1310   95
Alex   Chem 2315   86
Tim    Span 1443   81

これは私が得ている出力です

Tim  Span 1443  54
Tim  Span 1443  95
Tim  Span 1443  86
Tim  Span 1443  81
4

1 に答える 1