zndns 2015-04-27 21:59 采纳率: 100%
浏览 2037
已采纳

求 linux 标准 C 语言判断2个字符串的一个函数

函数的原型为:
int diff_str(const char * a, const char * b);

主要是用来处理当A和B 中存在有符号点 “.” 或星号 “*”时的判断关系。

星号出现的(位置不定),且 (不限制长度) 匹配 [a-z0-9] 中包含的字符。

注意: 星号不能匹配 "."

例如:
a=“hello*world”;
b=“hello.world”;
这个时候 a != b;

a=“hello*world”;
b=“hellower9world”;
这个时候 a == b;

a="*";
b="adfafdafd";
这个时候 a == b;
最好再加个判断如果 输入 的a 非 [a-z0-9.] 直接返回。
要求性能高效。

思路我有,关键是求一个效率高的算法。求代码:
int n=0, d=0;
for (p1 = a, p2= a + strlen(a) - 1; p2 > p1; ++p1, --p2){
if (*p1 == '*'){
if (!strncmp(a, b, n)){
d=1;
}
break;
} else if (*p2 =='*'){
if (!strncmp(a, b,strlen(a)-n-1)){
d=1;
}
break;
}
n++;
}

定位"*" 号位置我只知道这样两边查找。
求更高效的。

  • 写回答

7条回答 默认 最新

  • 知常曰明 2015-04-28 06:21
    关注
    #include <stdio.h>
    
    int diff_str(const char *a, const char *b)
    {
        const char *s = a;
        const char *t = b;
        for (;; s++, t++)
        {
            if (*s == NULL && *t == NULL)
                return 1;
            else if (*s == NULL || *t == NULL)
                return 0;
            if (*s == *t)
                continue;
            if (*s == '*')
            {
                if (*t == '.')
                    return 0;
                if (diff_str(s, t + 1))
                    return 1;
                else if (*(s + 1) == *t)
                {
                    s++;
                    if (*s == NULL)
                        return 1;
                }
            }
            else
                return 0;
        }
    }
    void d(const char *a, const char *b)
    {
        int r = diff_str(a, b);
        if (r)
            printf("'%s' matches '%s'\n", a, b);
        else
            printf("'%s' DOES NOT match '%s'\n", a, b);
    }
    int main()
    {
        d("", "");
        d("*", "");
        d("*", "t");
        d("t", "t");
        d("*t", "st");
        d("*t", "sat");
        d("s*t", "sat");
        d("sa*", "sat");
        d("s*", "sat");
        d("s*t*s", "satas");
        d("s*t*s", "sata1s");
        d("s*t*s", "sats");
        d("s*t*s", "sts");
        d("s*t*s", "sat.s");
        d("s*t*s", "sata");
        d("s*t*s", "sat");
        d("s*t*s", "saas");
        d("s*s", "satatatas");
        d("s*tas", "satatatas");
        d("s*tatas", "satatatas");
        d("s*tatatas", "satatatas");
        d("s*tatatatas", "satatatas");
        printf("=====================================\n");
        d("au*ex*.bat", "autoexec.bat");
        d("au*e*.bat", "autoexec.bat");
        d("au*.bat", "autoexec.bat");
        d("au**.bat", "autoexec.bat");
        d("au*ex*bat", "autoexec.bat");
        d("au*ex*.b*t", "autoexec.bat");
        d("au*ex*.*", "autoexec.bat");
        d("*.*", "autoexec.bat");
        printf("=====================================\n");
    
        getchar();
    }
    

    结果

    '' matches ''
    '*' DOES NOT match ''
    '*' matches 't'
    't' matches 't'
    '*t' matches 'st'
    '*t' matches 'sat'
    's*t' matches 'sat'
    'sa*' matches 'sat'
    's*' matches 'sat'
    's*t*s' matches 'satas'
    's*t*s' matches 'sata1s'
    's*t*s' matches 'sats'
    's*t*s' matches 'sts'
    's*t*s' DOES NOT match 'sat.s'
    's*t*s' DOES NOT match 'sata'
    's*t*s' DOES NOT match 'sat'
    's*t*s' DOES NOT match 'saas'
    's*s' matches 'satatatas'
    's*tas' matches 'satatatas'
    's*tatas' matches 'satatatas'
    's*tatatas' matches 'satatatas'
    's*tatatatas' DOES NOT match 'satatatas'
    =====================================
    'au*ex*.bat' matches 'autoexec.bat'
    'au*e*.bat' matches 'autoexec.bat'
    'au*.bat' matches 'autoexec.bat'
    'au**.bat' matches 'autoexec.bat'
    'au*ex*bat' DOES NOT match 'autoexec.bat'
    'au*ex*.b*t' matches 'autoexec.bat'
    'au*ex*.*' matches 'autoexec.bat'
    '*.*' matches 'autoexec.bat'
    =====================================
    

    尚有个小问题 可以代替0个字符么?如果可以的话,那么结果'' DOES NOT match ''有误;如果不可以,则's*t*s' matches 'sts'有误

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记