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】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |