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

问题描述

求 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++;
}

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

解决方案

#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'有误

解决方案二:

思路如下:
1) 找到 A 中星号的位置,按此位置将 A 分成两部分;
2)按 1) 中的两部分的长度,分别从 B 的开始与结束进行比较;
3)如果相等,再对 B 中间剩余的部分进行判断;如果不相等,则完成;
4)B中间部分,先按是否是 . 进行;再进行其它想要的判断。

解决方案三:

基本上就是正则的语法。自己做的话,可以进行字符查找。找到星号位置,然后再截取子字符串。比较

解决方案四:

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

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

解决方案五:

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

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

解决方案六:

asrtttttttttttttttttttttttttttttdfgdss

解决方案七:

使用正则表达式,然后自己做字符查找

时间: 2024-10-28 10:36:02

c-求 linux 标准 C 语言判断2个字符串的一个函数的相关文章

求linux下c语言开源代码

问题描述 求linux下c语言开源代码 谁有c的开源代码,上午面试,面试官出了道题,让我找一个源代码,20个左右的.c.h文件, 让编译完给他发过去,并了解功能,谢谢啦 解决方案 github google codeproject sourceforge 面试官无非就是考下你是不是听说过这4个网站之一. 解决方案二: 我有Linux操作系统源代码,要吗?893277858QQ 解决方案三: Linux本身就是开源的,你要下载源代码很简单啊http://www.kernel.org/ 这个上面就是

PHP判断两个字符串的相似性函数

 代码如下 复制代码 similar_text($string1, $string2, $percent); 注释:levenshtein() 函数比 similar_text() 函数更快.不过,similar_text() 函数通过更少的必需修改次数提供更精确的结果.

C语言判断字符是否为可打印字符的方法_C 语言

C语言isprint()函数:判断字符是否为可打印字符头文件: #include <ctype.h> isprint() 函数用来判断一个字符是否为打印字符,其原型为: int isprint(int c); [参数]c 为需要被检测的字符. [返回值]如果 c 为可打印字符,将返回非 0 值,否则返回 0. 可打印字符的ASCII码值大于 0x1f(除了0x7f(DEL)),这些字符可以显示到屏幕上,让我们看到:不能显示在屏幕上,我们看不到的,叫控制字符,ASCII码值为 0x00 ~ 0x

u盘-Linux系统下,怎样用C语言判断U盘插入和拔出,并获取U盘路径?

问题描述 Linux系统下,怎样用C语言判断U盘插入和拔出,并获取U盘路径? Linux系统下,用C语言判断U盘插入和拔出,并获取U盘路径.名字和容量等信息.请大神们指点指点. 解决方案 首先U盘是块设备,有专门的工具(fdisk,blockdev)可以查看U盘(/dev/sda)的具体信息,也可以通过 C语音open("/dev/sda", ...);ioctl(...)来获取U盘信息. u盘插入后,一般会出现类似/dev/sda或者/dev/block/下面的某个设备,相应的拔出会

c++-C语言 判断两值相等 迫不得已求帮忙

问题描述 C语言 判断两值相等 迫不得已求帮忙 具体内容 现有两个值 要判断这两个值相等 相等输出1 不相等输出0 而且不能用任何loop, if else,switch == 大于小于号之类 不能用bool 类型 凡是关于选择的函数和命令都不能用 说白了只能进行纯计算..求帮忙啊!!! 解决方案 以integer为例:#include#include using namespace std;int cmp(int aint b){ return !(a ^ b);}int main(){ in

使用c语言判断100以内素数的示例(c语言求素数)_C 语言

从console输入一个数,判断这个数是否为素数(质数). 复制代码 代码如下: #include <stdio.h> /**判断100以内的素数*/ //定义函数判断是否是素数int isPrime(int num ){    int i;    //从2开始循环,一直到i的平方小于等于给定的数.    for (i = 2; i*i <= num; i++) {        if ( ( num % i ) == 0 ) {            return 0;       

linux中c语言errno的使用

在linux中使用c语言编程时,errno是个很有用的动动.他可以把最后一次调用c的方法的错误代码保留.但是如果最后一次成功的调用c的方法,errno不会改变.因此,只有在c语言函数返回值异常时,再检测errno. errno会返回一个数字,每个数字代表一个错误类型.详细的可以查看头文件./usr/include/asm/errno.h 如何把errno的数字转换成相应的文字说明? 方式一:可以使用strerrno函数 char *strerror(int errno) 使用方式如下: fpri

《嵌入式 Linux C 语言应用程序设计(修订版)》——第 2 章 嵌入式Linux C语言开发工具 2.1 嵌入式Linux下C语言概述

第 2 章 嵌入式Linux C语言开发工具 本章目标 任何应用程序的开发都离不开编辑器.编译器及调试器,嵌入式Linux的C语言开发也一样,它也有一套优秀的编辑.编译及调试工具. 掌握这些工具的使用是至关重要的,它直接影响到程序开发的效率.因此,希望读者能自己动手操作,切实熟练掌握这些工具的使用.通过本章的学习,读者将会掌握如下内容: 2.1 嵌入式Linux下C语言概述 读者在第一章中已经了解了嵌入式开发的基本流程,在嵌入式系统中应用程序的主体是在宿主机中开发完成的,就嵌入式Linux而言,

编程-Linux中c语言多线程gdb调试“Cannot access memory at address”如何解决

问题描述 Linux中c语言多线程gdb调试"Cannot access memory at address"如何解决 程序的目的是做一个xml解析的工作. 部分代码如下: #define BUFLEN 10240 typedef struct buffer_t//需要操作的结构体 { char *buf; Bcsarray *bcsay; int bufnum; struct buffer_t *next; }databuf; databuf *buf, *bufs;//buf为链表