//========================================================================
方法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;
}
联系客服