C言語関係掲示板

過去ログ

No.402.ワイルドカード文字列

[戻る] [ホームページ]
No.2786

ワイルドカード文字列
投稿者---HyperBeat(2002/09/26 14:10:06)
http://hyper-beat.escape.to/


質問です

ワイルドカードの文字列と通常の文字列を照合したいのですがやりかたがわからないのです

たとえば "*.txt" と "text.txt" を比べたりするにはどうすればいいのですか?
"?.*" と "1.txt" を比べたりするには?


どうすればいいのですか?

ご教授お願いします

No.2789

Re:ワイルドカード文字列
投稿者---ともじ(2002/09/26 15:25:56)


こんにちは。

>ワイルドカードの文字列と通常の文字列を照合したいのですがやりかたがわからないのです
>

ANSIレベルではワイルドカードはサポートされていませんので関数を
自作するようになります。
検索したら、面白いソースが見つかりました。
http://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip03.htm
参考にしてみてください。

No.2840

Re:ワイルドカード文字列
投稿者---かずま(2002/10/03 20:53:03)


> http://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip03.htm
> 参考にしてみてください。

末尾再帰はループにできるので、そうしたほうが効率がよくなります。
次のプログラムは、* の数だけしか、再帰呼び出しをしません。
#include <stdio.h>

int match(const char *pat, const char *str)
{
    for ( ; ; str++, pat++) {
        switch (*pat) {
         case '\0': return (*str == '\0');
         case '*':  for (pat++; !match(pat, str); str++)
                        if (*str == '\0') return 0;
                    return 1;
         case '?':  if (*str == '\0') return 0;   break;
         default:   if (*str != *pat) return 0;   break;
        }
    }
}

int main()
{
    char pat[1024], str[1024];

    while (scanf("%s%s", pat, str) == 2)
        puts(match(pat, str) ? "  match" : "  not match");
    return 0;
}