プロが教えるわが家の防犯対策術!

3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。というプログラムなんですが、なぜかこのままだとコンパイルはとおるんですが文字入力を3回とfor文で定めているはずなのに、4回になってしまいます。なぜなんでしょうか・・・?prints関数内のfor文はちゃんと動作していて3つ出力されているんですが。コンパイルエラーは無しです。分かるかた教えて頂けないでしょうか?

#include <stdio.h>
struct tag{
char name[20];
int age;
char sex[20];
};

void put (struct tag *ai);
void prints(struct tag *sei);

int main(void)
{

struct tag kansuu[3];
put(kansuu);
prints(kansuu);

return 0;
}

void put (struct tag *ai)
{
int i;
for(i=0;i <3;i++){
scanf("%s %d %s\n",(ai+i)->name,&(ai+i)->age,(ai+i)->sex);

}
return;}

void prints(struct tag *sei)
{
int i;
for(i=0;i <3;i++)
printf("%s %d %s\n",(sei+i)->name,(sei+i)->age,(sei+i)->sex);

return;}

A 回答 (1件)

scanf("%s %d %s",(ai+i)->name,&(ai+i)->age,(ai+i)->sex);



にしてください。ただ、scanfは使い方が非常に難しい関数なのでベテランの自覚が無い限り使わない方が良いです。
また、返値(何個の値が入力されたか)のチェックは必須です。

あと、この場合だと、
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 10 bbbbbbbbbbbbbbbbbbbbbbbbbb
のようなnameやsexのサイズを超える文字列入力があった場合、どうなるかわかりますか?%sには長さ指定が必須です。でも、単純に %19s じゃだめ。難しいでしょ?
http://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.A …


普通には、fgets関数で1行入力して、何らかの関数で区切って値をとります。
    • good
    • 0
この回答へのお礼

\n を抜くと、確かに3回ループになってくれました。
原因がよく分かりませんが勉強になりました。
ご回答ありがとうございました。

お礼日時:2011/10/25 18:39

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