K&Rを読もう(28) 問題2-5 文字のマッチング
2-4より先に2-5をやる。
文字列のマッチングをして、一致する文字の位置を返す問題。
mixi時代にkusakabeさんに激しく突っ込まれたのでよく覚えてる。
#include <stdio.h> #include <stdlib.h> int any(char *s, char *match) { int i = 0; char *sp; char *mp; for (;*s != '\0'; s++, i++) { if (*s == *match) { sp = s; mp = match; for (;*sp == *mp; sp++, mp++) ; if (*mp == '\0') return i; } } return -1; } int main(void) { printf("%d\n", any("01234567", "345")); /* 3 */ printf("%d\n", any("bababcab", "babc")); /* 2 (凶悪なパターン) */ printf("%d\n", any("", "abc")); /* -1 */ printf("%d\n", any("abcdefgh", "")); /* -1 */ exit(EXIT_SUCCESS); }
kusakabeさんって口は悪いけどいい人。
exit(EXIT_SUCCESS)はkusakabeさんの影響です。うふ。
- 先頭ポインタを保存しておかなければならないので、配列を使った方がわかりやすかったかも。
- 同じような文字が続いた時の処理があるので、文字列マッチのアルゴリズムを適用しない場合、頭から1つづつチェックする必要がある。
- ステップ数は「入力文字*マッチ文字」なので、長い文字列を比較すると膨大なステップ数が必要となる。
todo
BM法を使ったアルゴリズムをちゃんと覚える。
mixi
mixi CとC++ | そんなことおしえてねーよ!
ガーンまた突っ込まれてしまった・・・exit(EXIT_SUCCESS)は、return EXIT_SUCCESSと書くのが普通らしい。
どうやら、kusakabeさんの影響では無いらしい・・・。