回答編集履歴

1

scanf について説明を追加

2020/07/09 01:12

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -21,3 +21,57 @@
21
21
  ```
22
22
 
23
23
  何をしているか分かりますか?
24
+
25
+
26
+
27
+ **追記**
28
+
29
+ scanf("%s", str2); なら分かるんですよね。
30
+
31
+ それでも構いませんが、char str2[10]; の場合、
32
+
33
+ 文字列の終端の '\0' を除いて 9文字しか格納できません。
34
+
35
+ ユーザが間違って 10文字以上入力すると配列の範囲外に
36
+
37
+ 格納しようとして他の大切なデータを破壊したりします。
38
+
39
+ これをバッファ―オーバーランと言います。
40
+
41
+ こういった問題を防ぐために scanf の書式には、
42
+
43
+ 入力文字数制限を書くことができます。
44
+
45
+ それが "%9s" です。
46
+
47
+
48
+
49
+ また元のコードが正しくないのは分かっているのでしょうか?
50
+
51
+ scanf("%d", &num); では、入力が 12 でも 012 でも 0012 でも
52
+
53
+ num の値が 12 になります。
54
+
55
+ ということは入力の区別ができなくなったということです。
56
+
57
+
58
+
59
+ 入力が正し場合、scanf("%*[^\n]"); は不要です。
60
+
61
+ 不正な入力を再入力させたいなら、次のように書きます。
62
+
63
+ ```C
64
+
65
+ do {
66
+
67
+ printf("\r数値を入力して下さい。\n");
68
+
69
+ fflush(stdout);
70
+
71
+ if (scanf("%d", &num) == 1) break; // 入力エラーなし
72
+
73
+ scanf("%*[^\n]"); // 行末まで不正文字を削除
74
+
75
+ }
76
+
77
+ ```