回答編集履歴

3

誤字の修正

2020/07/08 00:24

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  **追記2**
66
66
 
67
- この scanf("%*[^\n]"); による現在の行の不正文字読み飛ばしには
67
+ この scanf("%*[^\n]"); による現在の行の不正文字読み飛ばしには
68
68
 
69
69
  注意しなければならないことがあります。
70
70
 
@@ -72,7 +72,7 @@
72
72
 
73
73
 
74
74
 
75
- 次の入力が scanf("%d" や scanf("%s などであれば、
75
+ 次の入力処理が scanf("%d" や scanf("%s などであれば、
76
76
 
77
77
  その '\n' を呼び飛ばしてくれるので問題ありません。
78
78
 

2

コードの注意点を追記

2020/07/08 00:24

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -61,3 +61,23 @@
61
61
  int main(void)
62
62
 
63
63
  ```
64
+
65
+ **追記2**
66
+
67
+ この scanf("%*[^\n]"); による現在の行の不正文字は読み飛ばしには
68
+
69
+ 注意しなければならないことがあります。
70
+
71
+ それは行末の '\n' が入力バッファに残っているということです。
72
+
73
+
74
+
75
+ 次の入力が scanf("%d" や scanf("%s などであれば、
76
+
77
+ その '\n' を呼び飛ばしてくれるので問題ありません。
78
+
79
+
80
+
81
+ しかし、scanf("%c" や scanf("%[ では、'\n' を読み込んでしまいます。
82
+
83
+ また、getchar() や fgets でも '\n' を文字として読み込んでしまいます。

1

コードを追加

2020/07/07 14:31

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -29,3 +29,35 @@
29
29
  }
30
30
 
31
31
  ```
32
+
33
+ **追記**
34
+
35
+ scanf は、もう一つあったんですね。
36
+
37
+ ```diff
38
+
39
+ {
40
+
41
+ int x;
42
+
43
+ printf("もう一度しますか""(0)いいえ (1)はい :");
44
+
45
+ - scanf("%d", &x);
46
+
47
+ -
48
+
49
+ - return x;
50
+
51
+ + if (scanf("%d", &x) == 1) return x;
52
+
53
+ + scanf("%*[^\n]"); // 行末まで不正な文字を読み飛ばす
54
+
55
+ + return 2;
56
+
57
+ }
58
+
59
+
60
+
61
+ int main(void)
62
+
63
+ ```