teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

説明を一部修正

2015/05/10 16:13

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -12,8 +12,8 @@
12
12
 
13
13
  この理由についてはscanfの動作を知る必要があります。
14
14
  scanfは文字列から特定パターンを読み込み、引数に読み取った値を代入しますが、以下のように動作しています。
15
- 1.パターンにマッチした読み取り可能な文字を見つけるまで読み捨てる ※%dなら0-9を見つけるまで
15
+ 0.パターンにマッチした読み取り可能な文字を見つけるまで読み捨てる ※%dなら0-9を見つけるまで 入力"a123b"なら"a"は捨てられる
16
- 2.パターンとして認識できる間読み取りを続ける ※%d 入力"a123b"なら3まで bは0-9では無い
16
+ 0.パターンとして認識できる間読み取りを続ける ※%d 入力"a123b"なら3まで bは0-9では無い
17
- 3.パターンの認識から外れたところで読み取りを終了する ※"a123b"なら"b\n"が入力バッファに残る
17
+ 0.パターンの認識から外れたところで読み取りを終了する ※"a123b"なら"b\n"が入力バッファに残る
18
18
 
19
19
  入力バッファ自体はENTERキーを押下するところまで読み込まれるので、入力バッファの最後には必ず"\n"が含まれます。tena=getchar()はscanf()後に他の関数の動作が不安定なためにつけたものと思いますが、動作が不安定になるのはscanf実行後'\n'が最低1文字分入力バッファに残るためです。逆に言うと、残った入力バッファの終端は必ず'\n'になるので'\n'まで読み飛ばすことで入力バッファに残ったゴミを処理することができます。

1

コードにコメントを追加

2015/05/10 16:13

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  ```lang-C
6
6
  int number;
7
7
  scanf("%d", &number);
8
- while(getchar() != '\n');
8
+ while(getchar() != '\n'); // scanf実行後この記述を追加
9
9
  ```
10
10
 
11
11
  より良い修正方法としてはmaisumakunさんのおっしゃるようにfgets等を使用することですが、学習に際してscanfを使う場合には上記のように'\n'まで読み捨てを行うといいでしょう。