- 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;
- }
来源: http://www.phpxs.com/code/1004238/