社区
非技术区
帖子详情
求助:带通配符字符串比较的问题
Sunbow_xlj
2002-03-29 01:58:55
请编程
比较两个字符串str1,str2,允许str2中存在通配符 “*”和“?”,
‘*’代表任意个字符;
‘?’代表一个字符。
例如 str1 = 111abcd2228000
str2 = 111*222*?000
那么 认为str1 等于 str2;
...全文
130
6
打赏
收藏
求助:带通配符字符串比较的问题
请编程 比较两个字符串str1,str2,允许str2中存在通配符 “*”和“?”, ‘*’代表任意个字符; ‘?’代表一个字符。 例如 str1 = 111abcd2228000 str2 = 111*222*?000 那么 认为str1 等于 str2;
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jishiping
2002-03-29
打赏
举报
回复
下面是我的程序适用的函数,包括对* 和 ?的处理。我用的好好的,
到目前还没有用户反映有问题。
BOOL IsStrMatched(LPCSTR Val, LPCSTR Match, int len)
{
int n;
int num;
bool ret;
LPCSTR s;
if (!Val || !Match)
return FALSE;
num = len<0 ? strlen(
Match) : len;
for(; *Match&# num-=n) {
if (*Match=='?') {
if (*Val=='\0')
return FALSE;
Match++; Val++;
n = 1; continue;
}
if (*Match != '*') {
if (*Match!=*Val)
return FALSE;
Match++; Val++;
n = 1; continue;
}
while(*Match=='*') {
num--; Match++;
if (num == 0)
return 1;
}
if (*Match=='\0')
return TRUE;
s = strchr(Match,'*');
if (s != NULL)
n = s - Match;
else
n = strlen(Match);
for(; *Val; Val++) {
if (IsStrMatched(
Val,Match,n))
break;
}
if (*Val == '\0')
return FALSE;
Match += n; Val += n;
}
return num==0 && (len>=0
|| *Val==0);
}
hcpp
2002-03-29
打赏
举报
回复
1.转化str2=111*222*?000
=>str2=111*222*000
2,分解str2=>
str2_temp1=111;
str2_temp2=222;
str2_temp3=000;
并将他们存入CstringArray strArray;
3.比较:
\\声明查找指针:pos;(指明当前str1查找的位置)
int pos=0;
int i=0;
if(pos=str1.find(strArray[i].[0],pos)==-1)
return false;
while( pos<str1.GetLength())
{
if(str1.Left(strArray[i].GetLength()).Compare(strArray[i])
==0)
{
if(i<strArray.GetLength())
{
pos+=strArray[i].GetLength();
i++;
}
else
{
if(pos<str1.GetLength())
return true;
else
return false;
}
}
else
return false;
if(pos=str1.find(strArray[i].[0],pos)==-1)
return false;
}
大概就是这样,我没有vc,没有调试,但我想应该没问题!
garfield_82
2002-03-29
打赏
举报
回复
不好意思,equal的初值应该为1
garfield_82
2002-03-29
打赏
举报
回复
# include <iostream>
# include <string>
using namespace std;
int main()
{
const char cAny = '*';
const char cOne = '?';
string string1, string2; // string2 can include tokens
int ix;
bool equal = 0;
cout << " Input String1 = ";
cin >> string1;
cout << " Input String2 ( can including '*' or '?') = ";
cin >> string2;
for ( ix = 0; ix < string2.size() ; ix ++ )
{
if ( string2 [ ix ] == cAny )
{
equal = 1;
break;
}
if ( string2 [ ix ] == cOne )
string2 [ ix ] = string1 [ ix ];
if ( string2 [ ix ] != string1 [ ix ] )
{
equal = 0;
break;
}
}
if ( equal == 1 )
cout << "Equal";
else
cout << "Not Equal";
return 0;
}
我写了一个,你看看
garfield_82
2002-03-29
打赏
举报
回复
同意freezingfire,你这样认为*是由问题的,因为如果*代表任意个字符,那么 111* == 111abcd2228000
freezingfire
2002-03-29
打赏
举报
回复
首先,你*的用法不对,*后面不可以再有字符,像你的用法会产生歧义。
如果只是?的话则非常容易了。
Python 47个
字符串
方法
# Python 47个
字符串
方法## 课程介绍同学们是否总是要搜资料、查官网后,才知道怎么操作
字符串
?如果是,来学学本课程吧,本课程以讲解官网文档的方式,讲解 Python 47个
字符串
方法,涉及替换、删除、连接、查找、...
计算机网络知识点总结(超全,配有常见习题)
计算机网络知识点总结(超全,配有常见习题) 第一章 概述 计算机网络(简称网络)把许多计算机连接在一起,而互联网则把许多网络连接在一起,是网络的网络。因特网是世界上最大的互联网。 以小写字母i开始的...
计算机网络
> 不归零制,但有自同步能力,可从信号波形自身中提取信号时钟频率 基本
带
通调制方法 数字通信优点:信号在信道上传输时必失真(只要识别出原有信号,就没有影响) 失真与传输速率,距离,噪声成正比 信道能通过的...
计算机网络知识点总结
另一个比特串:删除发送端加入的零比特后变成000111011111-11111-110(连字符表示删除了零)。 百度知道详解:比特填充法的具体做法是:在发送端,当一串比特流尚未加上标志字段时,先用硬件扫描整个帧。只要发现5...
计算机网络简答题
答:(1)报文分组,加首部(2)经路由器储存转发(3)在目的地合并1-03 试从多个方面
比较
电路交换、报文交换和分组交换的主要优缺点。 答:(1)电路交换:端对端通信质量因约定了通信资源获得可靠保障,对连续传送...
非技术区
15,440
社区成员
58,165
社区内容
发帖
与我相关
我的任务
非技术区
C/C++ 非技术区
复制链接
扫一扫
分享
社区描述
C/C++ 非技术区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章