gets関数と構造体について
名前を入力して、各教科の点数を入力したあと、それを表示するプログラムを作りました。
完成はしたのですが、分からないところがあるので質問させて頂きます。
#include <stdio.h>
#include <string.h>
typedef struct {
char name[32];
int kokugo;
int rika;
} siken;
int main() {
siken tensu[5]; // = {"三村",80,45,"大竹",90,85,"松本",75,60,"狩野",100,100,"大江",95,90};
char name[32],point[16],end[6];
int i=0;
do {
printf("名前を入力してください。 : ");
gets(tensu[i].name);
//tensu[i].name = name;
printf("国語 : ");
gets(point);
tensu[i].kokugo = atoi(point);
printf("理科 : ");
gets(point);
tensu[i].rika = atoi(point);
i++;
printf("入力を終わりますか?(YES=0,NO=1) : ");
gets(end);
} while (atoi(end));
i=0;
do {
printf("氏名を入力して下さい。 : ");
gets(name);
while (strcmp(name,tensu[i].name))
i++;
printf("氏名 : %s\n国語 : %d\n理科 : %d\n",tensu[i].name,tensu[i].kokugo,tensu[i].rika);
printf("終わりますか?(YES=0,NO=1) : ");
gets(end);
if (atoi(end)==0)
break;
else if(atoi(end)!=1) {
printf("入力に誤りがあります。もう一度入力して下さい。 : ");
gets(end);
continue;
}
} while (atoi(end));
return 0;
}
このプログラムの
printf("名前を入力してください。 : ");
gets(tensu[i].name);
//tensu[i].name = name;
printf("国語 : ");
gets(point);
tensu[i].kokugo = atoi(point);
printf("理科 : ");
gets(point);
tensu[i].rika = atoi(point);
i++;
printf("入力を終わりますか?(YES=0,NO=1) : ");
gets(end);
の部分で、点数を入力するとき、
scanf("%d",tensu[i].kokugo);
とすると、入力を終了するための入力が飛ばされ、いきなり表示に行きます。(入力を終わりますか?の表示のだけですぐデータ表示のための「氏名を入力してください」が表示される感じです。)
また、この部分の最後のendをint型のj(初期化したものです)に置き換えると「入力を終わりますか?」の入力はできるのですがデータの表示がエラーでできなくなります。
この部分が分からず、もやもやが残っているので質問させていただきました。
長文で申し訳ないです。
回答よろしくお願いいたします。
お礼
irbで値が見えました。ありがとうございました。