回答編集履歴
1
コメントなど一部修正
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
while (sx < slen && enji <= maxEnji) {
|
34
34
|
|
35
|
-
int tpos = tx + sx + enji; // 検査する tstr の
|
35
|
+
int tpos = tx + sx + enji; // 検査する tstr の位置
|
36
36
|
|
37
37
|
if (tpos >= tlen) break; // オーバーラン対策
|
38
38
|
|
@@ -42,11 +42,11 @@
|
|
42
42
|
|
43
43
|
if (tstr[tpos] == sstr[sx]) {
|
44
44
|
|
45
|
-
++sx; // 一致
|
45
|
+
++sx; // 一致、sstr の次の文字に移る
|
46
46
|
|
47
47
|
} else {
|
48
48
|
|
49
|
-
++enji; //
|
49
|
+
++enji; // 衍字、tstr の比較位置をずらす
|
50
50
|
|
51
51
|
}
|
52
52
|
|
@@ -54,7 +54,7 @@
|
|
54
54
|
|
55
55
|
|
56
56
|
|
57
|
-
if (sx == slen) // sstr の最後まで来
|
57
|
+
if (sx == slen) // sstr の最後まで来たら、成功!
|
58
58
|
|
59
59
|
return true;
|
60
60
|
|
@@ -78,8 +78,8 @@
|
|
78
78
|
|
79
79
|
```
|
80
80
|
|
81
|
-
こういう処理は、いつまでも main() の中でやってしまうので
|
81
|
+
こういう処理は、いつまでも main() の中でやってしまおうとするのでなく、さっさと関数化することを心がけてください。そして関数の中では判定処理だけに集中する・・・これも分割統治のひとつの考え方です。私は true/false を返すだけの関数にしました。
|
82
82
|
|
83
83
|
質問者のコードが T[21] と S[11] だったので、引数を tstr、sstr として、それぞれ tlen, slen (文字列の長さ)、tx, sx (文字配列の添字)という変数名にしましたが、センス良くありません(苦笑)、そこは勘弁してください。
|
84
84
|
|
85
|
-
ちなみに、strstr() は許容する衍字数が0の場合
|
85
|
+
ちなみに、strstr() は許容する衍字数が0の場合なので、私はまず strstr() 関数を書いてみて(いわゆる車輪の再発明)、それを元に修正することで、このコードを得ました。
|