こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Cプログラムがどうしても動きません

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

投稿日時 - 2012-08-09 09:49:16

QNo.7634722

困ってます

質問者が選んだベストアンサー

実行した際に

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

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

投稿日時 - 2012-08-09 18:41:02

お礼

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

投稿日時 - 2012-08-09 19:44:14

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

Wr5

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

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

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

投稿日時 - 2012-08-09 10:40:10

お礼

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

投稿日時 - 2012-08-09 21:04:03

あなたにオススメの質問