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

回答編集履歴

3

追記

2019/06/29 16:28

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -11,7 +11,19 @@
11
11
  }
12
12
  > ```
13
13
 
14
- 『ここ』の行は、if文の条件を満たそうが満たすまいが実行されます。
14
+ 『ここ』の行は、if文の条件を満たそうが満たすまいが実行され
15
15
  breakが無かった場合iの値は10になっているので、str1[10]の値を代入していることになります。
16
16
 
17
- str1には10要素しかありませんので、範囲外アクセスが発生し未定義の動作を引き起こします。
17
+ str1には10要素しかありませんので、範囲外アクセスが発生し未定義の動作を引き起こします。
18
+
19
+ ---
20
+ 置換候補が見つかった時点でbreakすること自体は、効率上良いアイデアです。
21
+ 問題は『if文での判定』と『置換操作』を分離してしまったことです。
22
+
23
+ 次のように書けば問題無いでしょう。
24
+ ```C
25
+ if (inp[j] == str[i]) {
26
+ inp[j] = str1[i];
27
+ break;
28
+ }
29
+ ```

2

追記

2019/06/29 16:28

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,5 +1,7 @@
1
1
  > 前者と後者のコードは一見何も違いが無いんじゃないか
2
2
 
3
+ 後者のコードには明らかなバグがあります。
4
+
3
5
  > ```C
4
6
  for (j = 0; j < 100; j++) {
5
7
  for (i = 0; i < 10; i++) {
@@ -10,4 +12,6 @@
10
12
  > ```
11
13
 
12
14
  『ここ』の行は、if文の条件を満たそうが満たすまいが実行されます。
13
- breakしなかった場合iの値は10になっているので、str1[10]の値を代入していることになります。
15
+ breakが無かった場合iの値は10になっているので、str1[10]の値を代入していることになります。
16
+
17
+ str1には10要素しかありませんので、範囲外アクセスが発生し未定義の動作を引き起こします。

1

修正

2019/06/29 16:25

投稿

LouiS0616
LouiS0616

スコア35678

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