わかりましたので、ファイルからさまざまなものを取得するこのコードがあります
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