C言語関係掲示板

過去ログ

No.1226 文字列の比較にワイルドカードを取り入れたい

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

文字列の比較
投稿者---初心者(2004/08/16 14:51:02)


Cを勉強しているの初心者です。
文字列の比較にワイルドカードを取り入れたいのですが何かいい方法はないでしょうか?
たとえば
strcmp("*.txt",filename);
としてもうまくいきませんよね・・?


No.16190

Re:文字列の比較
投稿者---Yuki(2004/08/16 15:03:50)


>Cを勉強しているの初心者です。
>文字列の比較にワイルドカードを取り入れたいのですが何かいい方法はないでしょうか?
>たとえば
>strcmp("*.txt",filename);

filename変数に".txt"という文字列があるか確認したいのですか?
それならstrstr関数でできると思いますが・・・。

MSDNを「文字列操作ルーチン」で検索するとstr系の関数が一覧表示されるのでやりたいことを実現してくれる関数が見つけられるかもしれません。

#あと「初心者」という投稿者名はあまり好まれていないので、何でも良いから自分と識別できる名前を考えて投稿するようにしてください。


No.16192

Re:文字列の比較
投稿者---初心者改めCman(2004/08/16 15:12:52)


説明不足ですみません。
やりたいことは、フォルダ内のファイルの検索です。
strstr関数をどのように使えばよいのでしょうか・・・?


No.16194

Re:文字列の比較
投稿者---Sciggepy(2004/08/16 15:41:48)


失礼、こっちを見ずに書き込んでしまいました。
環境が書かれていないので判りませんが、Windowsでは、FindFirstFile系の関数を使います。


No.16193

Re:文字列の比較
投稿者---Sciggepy(2004/08/16 15:18:02)


あまりスマートではありませんが、
int strflt(const char *szStr1,const char *szStr2)
{
    int len1,len2,nc,i,j;

    len1=strlen(szStr1);
    len2=strlen(szStr2);
    nc=max(len1,len2);
    for(i=0;i<=nc;i++) if(szStr1[i]=='?') {
    } else if(szStr1[i]=='*') {
        for(j=i;j<=len2;j++) {
            if(strflt(&szStr1[i+1],&szStr2[j])==0) return 0;
        }
    } else {
        if(szStr1[i]<szStr2[i]) return -1;
        if(szStr1[i]>szStr2[i]) return 1;
    }
    return 0;
}
でできると思います。(szStr1にワイルドカードを指定し、すべての文字がマッチすれば0を返す。)
問題があれば、つっこんでください。


No.16197

Re:文字列の比較
投稿者---かずま(2004/08/16 19:06:56)


> 問題があれば、つっこんでください。
strflt("ab?", "ab") は 0 を返し、
strflt("?ab", "ab") は -1 を返しますね。

プログラムの書き方ですが、else が for に対応しているように見える
インデントが気になります。

私なら次のようなプログラムにします。

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



No.16198

Re:文字列の比較
投稿者---Sciggepy(2004/08/16 22:26:35)


>strflt("ab?", "ab") は 0 を返し、
>strflt("?ab", "ab") は -1 を返しますね。
これでは問題ないようですが?

>プログラムの書き方ですが、else が for に対応しているように見える
>インデントが気になります。
メモ帳で編集していた頃の癖です。(インデントが多くなりすぎると、画面からはみ出して編集しにくくなるので。)

「ワイルドカード」で検索した結果から
http://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip03.htm



No.16199

Re:文字列の比較
投稿者---Sciggepy(2004/08/16 22:50:57)


>>strflt("ab?", "ab") は 0 を返し、
>>strflt("?ab", "ab") は -1 を返しますね。
>これでは問題ないようですが?
嘘です。文字数が合っていませんね。