好きな「お肉」は?

学校の課題で上手くいかずに困っています。キーボードから入力したものを構造体に納める機能を関数で実装するんですが、1番目の構造体に入力した後、次の構造体に入力できません。下にその関数の部分を載せるので、どのように直したらいいか、また上手くいかなかった原因を教えてくだい。

typedef struct _Music {
char title[1024];
char artist[1024];
int year, month, day, star;
} Music;

void register_record(Music *mus, int *current_num_ptr);

int main(void)
{
Music musiclist[200];
int num_record = 0;
char buf[128], n;

while (1) {
printf("[1]Registration [q|Q]quit\nEnter Number> ");
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%c", &n);
if (n == 'q' || n == 'Q') {
break;
} else if (n == '1') {
printf("Registration\n");
register_record(musiclist, &num_record);
num_record = num_record + 1;
} else {
printf("wrong number\n");
}
}

return 0;
}

void register_record(Music *mus, int *current_num_ptr)
{
char tem[1024];
int x;
printf("Title> ");
scanf("%s", tem);
strcpy(mus->title, tem);
printf("Artist> ");
scanf("%s", tem);
strcpy(mus->artist, tem);
printf("Date(year)> ");
scanf("%d", &x);
mus->year = x;
printf("Date(month)> ");
scanf("%d", &x);
mus->month = x;
printf("Date(day)> ");
scanf("%d", &x);
mus->day = x;
printf("My Rate> ");
scanf("%d", &x);
mus->star = x;

printf("---Complete registration!!---\n");
printf("No.%d Title:%s Artist:%s Date:%d/%d/%d My Rate:%d\n", current_num_ptr, mus->title, mus->artist, mus->year, mus->month, mus->day, mus->star);
}

A 回答 (4件)

register_record( ) の mus は、


main でいう musiclist[200] の先頭だから
mus->title のようにアクセスしたら、常に先頭にアクセスすることになる。
mus[*current_num_ptr].title のようにアクセスしたらいいんじゃないかと思う。
    • good
    • 0
この回答へのお礼

返信がおそくなってしまいすみません。
アドバイスの通りにやって、コンパイルしてみたところ、上手くいきました!!ありがとうございました。

お礼日時:2006/07/01 00:20

 


 "register_record"内で、
"static int i;"を宣言して、
"mus"を、"mus + i"とし、
最後に"i ++"。
    • good
    • 0
この回答へのお礼

返信遅くなってしまって申し訳ないです。ご教授いただきありがとうございました。人によっていろんな方法があることが分かりました。

お礼日時:2006/07/04 00:11

>register_record(musiclist, &num_record);



register_record(&musiclist[num_record], &num_record);
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいすみませんでした。後でこの方法でもやってみたところ、上手く出来ていました。ありがとうございました。

お礼日時:2006/07/04 00:09

register_record()へは常にmusiclist[200]の先頭しか渡ってないですね。


呼び出し部分を
register_record(musiclist, &num_record);

register_record(musiclist[num_record], &num_record);
としたらどうですか?

printf("No.%d ... ", current_num_ptr,...);
ですが、ポインタのアドレスを表示してると思いますよ。
current_num_ptrはアドレス渡ししなくてもよいのでは?
    • good
    • 0
この回答へのお礼

一度この方法でやってみたんですけど、上手くコンパイル出来なかったんです…。でも、BLUEPIXYさんの方法で上手く出来ました!!アドバイスありがとうございました。

お礼日時:2006/07/01 00:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報