アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cを勉強中です。

年齢に-1が入力されるまで、名前、年齢、性別を聞くプログラムを作っているのですが、どうしてもうまく動きません。
具体的には、年齢を聞かれず、年齢?性別?_とまとめて表示されてしまいます。
ぜひともどこが間違っているか教えてください。お願いしますm(_ _)m

#include<stdio.h>

typedef struct{
char name[20];
int year;
char sex[6];
}student;


void read_data(int,student*);
void write_data(int,student*);

int main(void){
student data[10];
int i=0,j=0;

do{
read_data(i,data);
i++;

}while(data[i-1].year!=-1);

for(j=0;j<=i-1;j++){
write_data(j,data);
}
return 0;
}

void read_data(int i,student *data){
printf("%d人目\n",i);
printf("名前?\n",i);
scanf("%s\n",&(data[i].name));
printf("年齢?\n",i);
scanf("%d\n",&(data[i].year));
printf("性別?\n",i);
scanf("%s\n",&(data[i].sex));
return;
}
void write_data(int j,student *data){
printf("%d人目\t",j+1);
printf("名前:%s",data[j].name);
printf("年:%d",data[j].year);
printf("性:%s",data[j].sex);
return;
}

A 回答 (2件)

実行した際に



名前?
aaa(改行)
bbb(改行)
年齢?
性別?
ccc(改行)

のように名前の時に二回エンターキーを押していませんか?これは
scanf("%s\n",&(data[i].name));
の\nが存在するため、aaaの改行をフォーマットの一致と判断されただけで、scanfの終了と判断されないためです。
そのためbbb(改行)というふうに他の文字を入れることで、\nの一致を終了させるのですが、このbbbが実はバッファ上に残っているのです。
そのため、年齢?の際にバッファ上に残っているbbbを参照し、不一致と判断され、即終了していたわけです。
さらに、不一致で終了しているのでまだbbbはバッファ上に残っています。
従って、性別のところでccc(改行)としていますが、これは名前の時と同じことが起きていて、
scanfはbbb(改行)ccc(改行)を処理しているためdata.sexにはbbbが代入されます。
    • good
    • 0
この回答へのお礼

分かりやすい回答をありがとうございました^^
疑問が吹っ飛びました!

お礼日時:2012/08/09 19:44

>scanf("%s\n",&(data[i].name));


>scanf("%d\n",&(data[i].year));
>scanf("%s\n",&(data[i].sex));

scanf()の中の"\n"って必要ですか?

あと……このコードだと10人以上のデータを入力しようとすると吹っ飛びます。
# 名前が20文字を越えた場合、または性別が6文字を越えた場合もメモリ破壊しますけどね。
    • good
    • 0
この回答へのお礼

ですよね。。。\nが問題のようです。
ありがとうございますm(_ _)m

お礼日時:2012/08/09 21:04

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