设为首页收藏本站积分充值 不再解释,用心做事!    

易辅客栈

 找回密码
 立即注册

QQ登录

只需一步,快速开始

易辅客栈模块更新下载手游专用模拟器城通网盘 - 注册就送5元现金
快速领取论坛金钱免费获取易辅VIP会员
论坛资源失效举报链接广告位出租50元/每月
查看: 2441|回复: 1

[C/C++] 寻找文本 易转 C++写法

[复制链接]

签到天数: 1965 天

连续签到: 1 天

[LV.Master]伴坛终老

1004

主题

3546

帖子

10万

积分

管理员

讲师

Rank: 9Rank: 9Rank: 9

积分
103449

最佳新人社区QQ达人

发表于 2016-9-9 11:33:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转脚本编程。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
该函数格式如下:
InStr([start, ] string1, string2[, compare])

start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。
string1 必要参数。接受搜索的字符串表达式。
string2 必要参数。被搜索的字符串表达式。
Compare 可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。

在C++中也有类似的函数,比如strstr,strchr

但是这些函数都是从第一个字符进行比较的,而且返回是个指针。如果需要从一个长字符串中多次连续寻找指定的子串,就比较麻烦,所以我用C++编写了模仿instr功能的函数,通过重载实现了[Start]可选参数,以及一个区分大小写的标志,函数返回为位置整数而不是指针,与VB中不同的是,返回-1代表失败,0为字符串中第一个位置(C/C++风格)

下面是函数声明
[C++] 纯文本查看 复制代码
int InStr(int iStart,LPSTR lpSourceString,LPSTR lpFindString,bool bFullMatch);
int InStr(int iStart,LPSTR lpSourceString, char FindChr,bool bFullMatch);
int InStr(LPSTR lpSourceString,LPSTR lpFindString);
int InStr(LPSTR lpSourceString, char FindChr);


函数实现

//在源字串中按匹配方式查找子串或字符,
//找到后返回数组下标,即所在串中的位置,0为第一个字符,
//不成功返回-1
[C++] 纯文本查看 复制代码
//按字符串、匹配标志查找,
int InStr(int iStart,LPSTR lpSourceString,LPSTR lpFindString,bool bFullMatch)
{
int pos=-1,len1,len2,i,j,c;
char *tp,*fp,*p=NULL;
if (lpSourceString && lpFindString)
{
len1=strlen(lpSourceString);
len2=strlen(lpFindString);
if (len2 && iStart>=0 && len1>(len2+iStart))//判断字符长度是否有效
{
if (!bFullMatch || iStart)//不分大小写或者查询位置不是第一字符
{
//复制第一字符串
tp=new char[len1+1];
if (tp)
{
tp=strcpy(tp,lpSourceString);
if (!bFullMatch)tp=strupr(tp); //如果不分大小写,转换所有字符为大写
}


fp=new char[len2+1];//复制第二字符串
if (fp)
{
fp=strcpy(fp,lpSourceString);
if (!bFullMatch)fp=strupr(fp); //如果不分大小写,转换所有字符为大写
}

if (tp && fp)
{
for (i=iStart;i<=(len1-len2);i++)//从指定起点开始循环扫描
{
c=0;
for (j=0;j<len2;j++)//扫描一段字符串判断是否与要查找的字符串相等
{
if (tp[i+j]==fp[j])c++;else break;
}
if (c==len2)//如果找到,设置返回值,结束循环
{
pos=i;break;
}
}
}
if (tp){delete []tp;tp=NULL;}
if (fp){delete []tp;tp=NULL;}
}
else//区分大小写且起点位置为第一字符
{
p=strstr(lpSourceString,lpFindString);
if(p)pos=p-lpSourceString;
}
}
}
p=NULL;
return (pos);
}
//重载InStr,按单个字符、匹配标志查找,
int InStr(int iStart,LPSTR lpSourceString, char FindChr,bool bFullMatch)
{
int pos=-1,length,i;
char *tp,*p=NULL;
if (lpSourceString)
{
length=strlen(lpSourceString);
if (iStart>=0 && length>iStart)//判断字符长度是否有效
{
if (!bFullMatch || iStart)//不分大小写或者查询位置不是第一字符
{
//复制第一字符串
tp=new char[length+1];
if (tp)
{
tp=strcpy(tp,lpSourceString);
if (!bFullMatch)
tp=strupr(tp); //如果不分大小写,转换所有字符为大写
if (FindChr>=0x41 && FindChr<=0x5A ||
FindChr>=0x61 && FindChr<=0x7A)
FindChr&=0xDf;
}

if (tp)
{
for (i=iStart;i<length;i++)//从指定起点开始循环扫描
{
if (tp==FindChr)
{pos=i;break;}
}
}
if (tp){delete []tp;tp=NULL;}
}
else//区分大小写且起点位置为第一字符
{
p=strchr(lpSourceString,FindChr);
if(p)pos=p-lpSourceString;
}
}
}
p=NULL;
return (pos);
}
//重载InStr,按字符串、不分大小写,从第一个字符查找
int InStr(LPSTR lpSourceString,LPSTR lpFindString)
{
return (InStr(0,lpSourceString,lpFindString,false));
}
//重载InStr,按单个字符、不分大小写从第一个字符查找
int InStr(LPSTR lpSourceString, char FindChr)
{
return (InStr(0,lpSourceString,FindChr,false));
}


易辅学院--欢迎你,有你更出众。 易辅做最真最好的服务 www.yifuxueyuan.com

签到天数: 15 天

连续签到: 1 天

[LV.4]偶尔看看III

0

主题

27

帖子

74

积分

注册会员

Rank: 2

积分
74

社区QQ达人

发表于 2017-11-2 01:26:14 | 显示全部楼层
楼主超给力,易辅客栈真是难得给力的平台啊。
易辅学院--欢迎你,有你更出众。 易辅做最真最好的服务 www.yifuxueyuan.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

易辅解答服务
 
 
VIP咨询
VIP办理
易辅交流4群:
【易辅客栈】脚本4群
易辅交流5群:
【易辅客栈】交流5群
易辅交流6群:
【易辅客栈】交流6群
工作时间:
10:00-22:00

QQ|小黑屋|手机版|Archiver|VIP介绍|积分充值|易辅客栈 ( 苏ICP备16034616号-1 )

GMT+8, 2024-6-2 07:14 , Processed in 0.291724 second(s), 58 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表