- ベストアンサー
scanfの の意味
- scanfの\nの意味とは、入力バッファに残っている改行文字を読み飛ばすための記号です。
- 入力バッファには、scanfの前の入力などで残っている改行文字やスペースなどが含まれる場合があります。
- \nを使用することで、改行文字を読み飛ばして指定した変数に値を取得することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
https://www.sejuku.net/blog/24965#i-5 が参考になるかと。 要するに、 ・一回目のscanf()に入力した後には、最後の改行コード(<enter>したというコード)が まだバッファに残っている ・2回目のscanf()では、上記の通りバッファの頭に改行コードが残っているけど、 "%d"や"%s"であればそれを自動的に読み飛ばしてくれている ・3回目のscanf()でも同様に、2回目に入力した最後の改行コードが バッファの頭に残っているが、scanf("%c",...);だとそれをそのまま読み込むので 入力した'M'でなく、 バッファに残った' \n'を ..genderに入れてしまう。 このため、2回目以降でscanf("%c", ...)とする場合は、 "%c"でなく、 "\n%c" とか、"%*c%c" とやって、 バッファに残っている前回の改行コードを 読み飛ばしてやる必要がある。 っ感じです。
その他の回答 (2)
- trapezium
- ベストアンサー率62% (276/442)
> \nがあると、改行を読み飛ばすということですが、 > gender=M > には改行が含まれていないと思うのですが? そこじゃなく一つ前の %d で 11<enter> って入力する想定なんでしょう? その <enter> が次の %c に入ってきてる。 > そして、なぜnameには改行が含まれていないのでしょうか? %c と %s の処理の違い。簡単に言えば %c は文字種を問わず次の一文字、%s は前後のホワイトスペーススキップして一単語、詳しくは scanf() の仕様を確認
お礼
すいません、さっぱりわからないです・・・ 入力に<enter>が含まれているというのはご指摘で理解しましたが、それが%c、%d、%sでどう処理され、どう違うのかがわからないです。 仕様をネットで検索しても、これについての記述を見つけることができるませんでした。
- maiko04
- ベストアンサー率17% (345/1956)
/nは改行。 scanf("\n%c",&person1.gender);だと最初の改行文字は読み飛ばしますが scanf("%c",&person1.gender);だと改行文字が読み込まれてしまいます。
お礼
ご回答ありがとうございます。 \nがあると、改行を読み飛ばすということですが、 gender=M には改行が含まれていないと思うのですが? そして、なぜnameには改行が含まれていないのでしょうか?
お礼
なるほど!理解できました! そこで、%d、%sなら読み飛ばす、%cは読み飛ばさない、というのが仕様ということですね。 よくわかりました、ありがとうございます!!