素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

ワイルドカード

そんなに難しくなさそうなのに、思いのほか大変だった。こういう場合はassert.hを使ってきちんとテストすると安心。

#include <assert.h>

int matches(char *pattern, char *text) {
  do {
    switch (*pattern) {
    case '?':
      text++;
      break;
    case '*':
      return matches(pattern+1, text) || *text && matches(pattern, text+1);
    case '\\':
      pattern++;
      // fall through
    default:
      if (*pattern && !*text ||
          *pattern != *text++)
        return 0;
    }
  } while (*pattern++);
  return 1;
}

int main(int argc, char *argv[]) {
  // 1
  assert(matches("", ""));
  assert(matches("a", "a"));
  assert(matches("abc", "abc"));
  assert(matches("a?c", "abc"));
  assert(matches("a*", "abc"));
  assert(matches("a?c?", "abcd"));
  assert(matches("a\\?c", "a?c"));
  assert(matches("a\\*c", "a*c"));
  assert(matches("*", ""));

  // 0
  assert(!matches("", "a"));
  assert(!matches("a", "b"));
  assert(!matches("abc", "abd"));
  assert(!matches("a", ""));
  assert(!matches("a*", "baa"));
  assert(!matches("???", "abcd"));
  assert(!matches("a\\?c", "adc"));
  assert(!matches("a\\*c", "acb"));
  return 0;
}

NULのチェックを追加。