c语言递归实现的通配符搜索

这篇博客介绍了一个使用C语言编写的递归函数WildSearch,用于实现通配符搜索。函数处理了包括'*'和'?'在内的通配符,并在main函数中通过示例字符串进行测试。通过对字符串的逐字符比较和通配符处理,函数能够判断目标字符串是否匹配含有通配符的模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

#include <string.h>





bool WildSearch(char *psz_buf, int n_buflen, char *psz_sub, int n_sublen, bool b_full, char sz_prechar)

{

    if (n_buflen == 0 && n_sublen != 0)

    {

        if (n_sublen == 1 && psz_sub[0] == '*')

        {

            return true;

        }

        else

        {

            return false;

        }

    }

    else if (n_buflen != 0 && n_sublen == 0)

    {

        if (b_full)

        {

            return false;

        }

        else

        {

            return true;

        }

    }

    else if (n_buflen == 0 && n_sublen == 0)

    {

        return true;

    }



    if (psz_sub[0] == '*')

    {

        psz_sub++;

        n_sublen--;

        if (n_sublen == 0)

        {

            return true;

        }

        return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, '*');

    }

    else if (psz_sub[0] == '?')

    {

        psz_buf++;

        n_buflen--;

        psz_sub++;

        n_sublen--;

        return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, '?');

    }

    else

    {

        char *psz_star_pos = strchr(psz_sub, '*');

        char *psz_question_pos = strchr(psz_sub, '?');

        int n_len_to_star = (psz_star_pos == NULL) ? (int)strlen(psz_sub) : (int)(psz_star_pos - psz_sub);

        int n_len_to_question = (psz_question_pos == NULL) ? (int)strlen(psz_sub) : (int)(psz_question_pos - psz_sub);



        int n_compare_len = n_len_to_question > n_len_to_star ? n_len_to_star : n_len_to_question;

        if (_strnicmp(psz_buf, psz_sub, n_compare_len) == 0)



        //if (psz_buf[0] == psz_sub[0])

        {

            sz_prechar = psz_sub[0];

            psz_buf++;

            n_buflen--;

            psz_sub++;

            n_sublen--;

            return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, sz_prechar);

        }

        else

        {

            if (sz_prechar != '*')

            {

                return false;

            }

            psz_buf++;

            n_buflen--;

            return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, sz_prechar);

        }

    }

    return true;

}



int main(int argc, char** argv)

{

    char sz_buf[] = "abcdefghijkabc";

    char sz_sub[] = "abc?e*fg?i?*k*";

    //char sz_sub[] = "ae";



    bool b_result = WildSearch(sz_buf, (int)strlen(sz_buf), sz_sub, (int)strlen(sz_sub), false, ' ');



    printf("%d/n", b_result);



	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值