加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

split, midex, replace 基于C函数库字符串函数的基本实现

发布时间:2020-12-16 07:46:26 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 size_t split(const char *src,const char *delimiter,strarray stra) {stra.clear();char *temp = (char*)src;int len_src = strlen(temp);unsigned

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

size_t split(const char *src,const char *delimiter,strarray &stra)
 
{
stra.clear();
char *temp = (char*)src;
int len_src = strlen(temp);
unsigned long pro;
VirtualProtect(temp,len_src + 1,0x40,&pro);
char *pos_last = temp;
char *pos = strstr(temp,delimiter);
char chr = '';
int ret = 0;
int len_delimiter = strlen(delimiter);
while(pos)
{
chr = *pos;
*pos = '';
stra.push_back((const char*)pos_last);
*pos = chr;
pos_last = pos + len_delimiter;
pos = strstr(pos_last,delimiter);
++ret;
}
stra.push_back(pos_last);
++ret;
VirtualProtect(temp,pro,NULL);
return ret;
}
 
 
size_t _split(const char *src,const char delimiter,strarray &stra)
{
stra.clear();
char *temp = (char*)src;
int len_src = strlen(temp);
unsigned long pro;
VirtualProtect(temp,&pro);
char *pos_last = temp;
char *pos = strchr(temp,delimiter);
char chr = '';
int ret = 0;
while(pos)
{
chr = *pos;
*pos = '';
stra.push_back((const char*)pos_last);
*pos = chr;
pos_last = pos + 1;
pos = strchr(pos_last,NULL);
return ret;
}
 
 
 
 
 
//查找s1,s2,返回两者之间的内容,incsym为true时返回内容包括s1,s2
 
 
size_t midex(const char *src,const char *s1,const char *s2,strarray &stra,bool incsym)
{
stra.clear();
char *temp = (char*)src;
int len_src = strlen(temp);
unsigned long pro;
VirtualProtect(temp,&pro);
char *pos_left = temp,*pos_right = temp;
int len_s1 = strlen(s1),len_s2 = strlen(s2);
char chr = '';
int ret = 0;
while(1)
{
pos_left = strstr(pos_right,s1);
if(!pos_left)
break;
pos_left += len_s1;
pos_right = strstr(pos_left,s2);
if(!pos_right)
break;
if(incsym)
{
chr = *(pos_right + len_s2);
*(pos_right + len_s2) = '';
stra.push_back(pos_left - len_s1);
*(pos_right + len_s2) = chr;
}
else
{
chr = *pos_right;
*pos_right = '';
stra.push_back(pos_left);
*pos_right = chr;
}
pos_right += len_s2;
++ret;
}
VirtualProtect(temp,NULL);
return ret;
}
 
 
size_t _midex(const char *src,const char c1,const char c2,*pos_right = temp;
char chr = '';
int ret = 0;
while(1)
{
pos_left = strchr(pos_right,c1);
if(!pos_left)
break;
pos_right = strchr(pos_left++,c2);
if(!pos_right)
break;
if(incsym)
{
chr = *(pos_right + 1);
*(pos_right + 1) = '';
stra.push_back(pos_left - 1);
*(pos_right + 1) = chr;
}
else
{
chr = *pos_right;
*pos_right = '';
stra.push_back(pos_left);
*pos_right = chr;
}
++pos_right;
++ret;
}
VirtualProtect(temp,NULL);
return ret;
}
 
 
size_t _replace(const char chOld,const char chNew,std::string &str)
{
int len_src = str.length();
char *temp = new char [len_src + 1];
strcpy_s(temp,str.c_str());
char *pos = temp;
size_t nResult = 0;
while(1)
{
pos = strchr(pos,chOld);
if(pos)
*pos = chNew;
else
break;
pos += 1;
++nResult;
}
str = temp;
delete temp;
return nResult;
 
}
 
 
 
 
//这里主要还是用了stl了,不用stl的话,在查找替换位置上,分配动态数组可能会麻烦点
 
//然后用了std::string += 的运算符重载,自己实现的话,从分配,释放内存上来看,是存在安全隐患的,然后拷贝字符串的代码可能也会麻烦点。
 
size_t replace(const char *lpOld,const char *lpNew,str.c_str());
size_t len_old = strlen(lpOld);
char *pos = temp;
std::vector<char*> vRepos;
while(1)
{
pos = strstr(pos,lpOld);
if(pos)
{
*pos = '';
vRepos.push_back(pos + len_old);
}
else
break;
pos += len_old;
}
size_t nSize = vRepos.size();
str.clear();
str = temp;
for(size_t nIndex = 0; nIndex < nSize; ++nIndex)
{
str += lpNew;
str += vRepos[nIndex];
}
delete temp;
return nSize;
} 

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读