質問: タイトルの通りです。 #include struct Person{ char name[100]; char gender; int age; }; int main(void) { struct Person person1; printf("名前は:"); scanf("%s",person1.name); printf("\n年齢は:"); scanf("%d",&person1.age); printf("\n性別は:"); scanf("\n%c",&person1.gender); printf("\n{name=%s,age=%d,gender=%c}",person1.name,person1.age,person1.gender); return 0; } 上記において aaa , 11 , M と入力すると {name=aaa,age=11,gender=M} と表示されますが、 scanf("\n%c",&person1.gender); を scanf("%c",&person1.gender); に変えると {name=aaa,age=11,gender= } となってしまいます。 この理由と、/nの意味を教えてください。
回答: が参考になるかと。 要するに、 ・一回目のscanf()に入力した後には、最後の改行コード(したというコード)が まだバッファに残っている ・2回目のscanf()では、上記の通りバッファの頭に改行コードが残っているけど、 "%d"や"%s"であればそれを自動的に読み飛ばしてくれている ・3回目のscanf()でも同様に、2回目に入力した最後の改行コードが バッファの頭に残っているが、scanf("%c",...);だとそれをそのまま読み込むので 入力した'M'でなく、 バッファに残った' \n'を ..genderに入れてしまう。 このため、2回目以降でscanf("%c", ...)とする場合は、 "%c"でなく、 "\n%c" とか、"%*c%c" とやって、 バッファに残っている前回の改行コードを 読み飛ばしてやる必要がある。 っ感じです。