回答編集履歴
1
コメントなど一部修正
answer
CHANGED
@@ -15,18 +15,18 @@
|
|
15
15
|
* tstr[tx] から始まる文字列は sstr と一致するか?
|
16
16
|
*/
|
17
17
|
while (sx < slen && enji <= maxEnji) {
|
18
|
-
int tpos = tx + sx + enji; // 検査する tstr の
|
18
|
+
int tpos = tx + sx + enji; // 検査する tstr の位置
|
19
19
|
if (tpos >= tlen) break; // オーバーラン対策
|
20
20
|
|
21
21
|
// sstr[sx] と一致する tstr[??] を見つけながら先へ進む
|
22
22
|
if (tstr[tpos] == sstr[sx]) {
|
23
|
-
++sx; // 一致
|
23
|
+
++sx; // 一致、sstr の次の文字に移る
|
24
24
|
} else {
|
25
|
-
++enji; //
|
25
|
+
++enji; // 衍字、tstr の比較位置をずらす
|
26
26
|
}
|
27
27
|
}
|
28
28
|
|
29
|
-
if (sx == slen) // sstr の最後まで来
|
29
|
+
if (sx == slen) // sstr の最後まで来たら、成功!
|
30
30
|
return true;
|
31
31
|
}
|
32
32
|
|
@@ -38,6 +38,6 @@
|
|
38
38
|
printf("valid");
|
39
39
|
*/
|
40
40
|
```
|
41
|
-
こういう処理は、いつまでも main() の中でやってしまうので
|
41
|
+
こういう処理は、いつまでも main() の中でやってしまおうとするのでなく、さっさと関数化することを心がけてください。そして関数の中では判定処理だけに集中する・・・これも分割統治のひとつの考え方です。私は true/false を返すだけの関数にしました。
|
42
42
|
質問者のコードが T[21] と S[11] だったので、引数を tstr、sstr として、それぞれ tlen, slen (文字列の長さ)、tx, sx (文字配列の添字)という変数名にしましたが、センス良くありません(苦笑)、そこは勘弁してください。
|
43
|
-
ちなみに、strstr() は許容する衍字数が0の場合
|
43
|
+
ちなみに、strstr() は許容する衍字数が0の場合なので、私はまず strstr() 関数を書いてみて(いわゆる車輪の再発明)、それを元に修正することで、このコードを得ました。
|