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

时间:2022-10-06 21:46:00


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 = '\0';
int ret = 0;
int len_delimiter = strlen(delimiter);
while(pos)
{
chr = *pos;
*pos = '\0';
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, len_src + 1, 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, len_src + 1, 0x40, &pro);
char *pos_last = temp;
char *pos = strchr(temp, delimiter);
char chr = '\0';
int ret = 0;
while(pos)
{
chr = *pos;
*pos = '\0';
stra.push_back((const char*)pos_last);
*pos = chr;
pos_last = pos + 1;
pos = strchr(pos_last, delimiter);
++ret;
}
stra.push_back(pos_last);
++ret;
VirtualProtect(temp, len_src + 1, pro, 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, len_src + 1, 0x40, &pro);
char *pos_left = temp, *pos_right = temp;
int len_s1 = strlen(s1), len_s2 = strlen(s2);
char chr = '\0';
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) = '\0';
stra.push_back(pos_left - len_s1);
*(pos_right + len_s2) = chr;
}
else
{
chr = *pos_right;
*pos_right = '\0';
stra.push_back(pos_left);
*pos_right = chr;
}
pos_right += len_s2;
++ret;
}
VirtualProtect(temp, len_src + 1, pro, NULL);
return ret;
}


size_t _midex(const char *src, const char c1, const char c2, strarray &stra, bool incsym)
{
stra.clear();
char *temp = (char*)src;
int len_src = strlen(temp);
unsigned long pro;
VirtualProtect(temp, len_src + 1, 0x40, &pro);
char *pos_left = temp, *pos_right = temp;
char chr = '\0';
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) = '\0';
stra.push_back(pos_left - 1);
*(pos_right + 1) = chr;
}
else
{
chr = *pos_right;
*pos_right = '\0';
stra.push_back(pos_left);
*pos_right = chr;
}
++pos_right;
++ret;
}
VirtualProtect(temp, len_src + 1, pro, 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, len_src + 1, 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, std::string &str)
{
int len_src = str.length();
char *temp = new char [len_src + 1];
strcpy_s(temp, len_src + 1, 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 = '\0';
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;
}