问题描述
- 求 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
解决方案七:
使用正则表达式,然后自己做字符查找