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

回答編集履歴

2

修正

2017/11/13 13:19

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -30,7 +30,7 @@
30
30
  ```
31
31
 
32
32
  こんな風になるんですね。(一行目が入力、二行目が出力)
33
- **scanfで読み切れなかった文字列がに回ってしまうのです。**
33
+ **一回目のscanfで読み切れなかった文字列が二回目に回ってしまうのです。**
34
34
 
35
35
  ---
36
36
  **for文について**

1

追記

2017/11/13 13:19

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,4 +1,42 @@
1
1
  scanfで文字を取得する際、改行コードがバッファに残ってしまっています。
2
2
  whileブロックの終わる前にgetcharを置くのが最も単純な対処法かと思います。
3
3
 
4
- また、ご提示のコードの場合、ループはfor文で記述した方が良いかと思われます。
4
+ また、ご提示のコードの場合、ループはfor文で記述した方が良いかと思われます。
5
+
6
+ コメントを受けて
7
+ ---
8
+ **バッファについて**
9
+ 入力はまずバッファ領域に置かれ、それから書式指定子に従って値を変数に保管します。
10
+ たとえば、こんなコードを書いたとします。
11
+ ```C
12
+ #include <stdio.h>
13
+
14
+ int main(void) {
15
+ char hoge;
16
+ char fuga[100];
17
+
18
+ scanf("%c", &hoge);
19
+ scanf("%s", fuga);
20
+
21
+ printf("%c, %s\n", hoge, fuga);
22
+ return 0;
23
+ }
24
+ ```
25
+
26
+ 『一文字入力してから、文を入力』という意図かと思いますが、これを無視すると...
27
+ ```
28
+ hogehoge
29
+ h, ogehoge
30
+ ```
31
+
32
+ こんな風になるんですね。(一行目が入力、二行目が出力)
33
+ **scanfで読み切れなかった文字列が次に回ってしまうのです。**
34
+
35
+ ---
36
+ **for文について**
37
+ for文とwhile文は、だいたいのケースで置き換え可能です。
38
+ しかしそれでは分かりにくいため、なんとなく使い分けが存在します。
39
+
40
+ `for(int i = 0; i < 10; i++) {`を見ただけで、10回繰り返すことが自明になります。
41
+
42
+ もう少し使い分けについて書こうと思ったのですが、なんとも不明瞭になってしまうのでやめました。