| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
kdloeki
10年前发布

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

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;  }