回答編集履歴

3

追記

2019/06/29 16:28

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -24,10 +24,34 @@
24
24
 
25
25
 
26
26
 
27
- 『ここ』の行は、if文の条件を満たそうが満たすまいが実行されます。
27
+ 『ここ』の行は、if文の条件を満たそうが満たすまいが実行され
28
28
 
29
29
  breakが無かった場合iの値は10になっているので、str1[10]の値を代入していることになります。
30
30
 
31
31
 
32
32
 
33
33
  str1には10要素しかありませんので、範囲外アクセスが発生し未定義の動作を引き起こします。
34
+
35
+
36
+
37
+ ---
38
+
39
+ 置換候補が見つかった時点でbreakすること自体は、効率上良いアイデアです。
40
+
41
+ 問題は『if文での判定』と『置換操作』を分離してしまったことです。
42
+
43
+
44
+
45
+ 次のように書けば問題無いでしょう。
46
+
47
+ ```C
48
+
49
+ if (inp[j] == str[i]) {
50
+
51
+ inp[j] = str1[i];
52
+
53
+ break;
54
+
55
+ }
56
+
57
+ ```

2

追記

2019/06/29 16:28

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,4 +1,8 @@
1
1
  > 前者と後者のコードは一見何も違いが無いんじゃないか
2
+
3
+
4
+
5
+ 後者のコードには明らかなバグがあります。
2
6
 
3
7
 
4
8
 
@@ -22,4 +26,8 @@
22
26
 
23
27
  『ここ』の行は、if文の条件を満たそうが満たすまいが実行されます。
24
28
 
25
- breakしなかった場合iの値は10になっているので、str1[10]の値を代入していることになります。
29
+ breakが無かった場合iの値は10になっているので、str1[10]の値を代入していることになります。
30
+
31
+
32
+
33
+ str1には10要素しかありませんので、範囲外アクセスが発生し未定義の動作を引き起こします。

1

修正

2019/06/29 16:25

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -22,4 +22,4 @@
22
22
 
23
23
  『ここ』の行は、if文の条件を満たそうが満たすまいが実行されます。
24
24
 
25
- breakしなかった場合iの値は11になっているので、str1[11]の値を代入していることになります。
25
+ breakしなかった場合iの値は10になっているので、str1[10]の値を代入していることになります。