//======================================================================== 方法1 //实现的功能是: 将字符串"askdaskaskdaskgasg"
删除指定的字符ask,删除后的结果是"ddgasg" //========================================================================= #include <stdio.h> #include <string> #include <iostream> using namespace std; void DeleteStr(string &Srcstr, const string &Substr) { string Results("");//保留字符 的结果数组 int i = 0; while(i < Srcstr.size()) { int j = i; int k = 0; while(k < Substr.size()) { if(Srcstr[j] == Substr[k])//如果当前的匹配则查找两个字符串的下一个字符 { j++; k++; } else//如果当前不相等则退出 break; } if(k == Substr.size())//得到了一个匹配的子串,就跳跃子串个字符后寻找下一个字符 { i += Substr.size(); } else if(k == 0)//此时一个字符都没有匹配到 { Results += Srcstr[i]; i++; } else//没有匹配子串,则当前已经匹配完了k,同时 k <
Substr.size(),那么将这k个字符放入到//保留字符 的结果数组, //然后在Srcstr中跳过 k个长度, 从k后的第一个字符开始寻找 { for(int t = i; t < i + k; t++) Results += Srcstr[t]; i += k;//从匹配的k个字符之后进行匹配 } } cout << "删除子串以后的结果为:" << Results << endl; } //方法2:比方法1慢,但是简单,只处理删除字符长度pSub_Len 和比较长度j 不等的情况,也不跳跃赋值,只是将 temp = i; 这单个字符拷入newstr[] //========================================================================= char *DelSubStr(char *pStrSrc, char *pSub,char newstr[]) { int pSub_Len=strlen(pSub),pStrSrc_Len=strlen(pStrSrc); int i = 0; int temp; int j = 0; int k = 0; while ( i < pStrSrc_Len) { temp = i; while (pSub[j] == pStrSrc[i]
&& i < pStrSrc_Len
&& j<pSub_Len)//同时判断多个条件时,前面的条件不满足了, //后面的条件就不会在判断了,把不容易满足的条件放在前面效率高一点 { i++; j++; } if (j != pSub_Len) { newstr[k++] = pStrSrc[temp]; i = temp+1; } j = 0; } newstr[k] = '\0'; cout <<newstr <<endl; return newstr; } int main() { string sub = "ask"; //解析:删除的是指定字符a s k,不是字符串"ask",所以将str中的每个字符都与sub中的字符比较, //如果相等,则停止,比较下一个。因为删除的最好办法是把不删除的东西提取出来。 string str = "askdaskaskdaskgasg"; DeleteStr(str,sub); return 0; } |
|