子串删除程序, 抛砖引玉

华亭真人 2011-02-24 03:11:07

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *temp;
void del_sub_str(char**s, char* sub)
{
int len1 = strlen(*s);
int len2 = strlen(sub);
if(len1 < len2)
return;
if(strcmp(*s, sub) ==0)
{
strcpy(*s, "");
return;
}
strcpy(temp, *s);
int i ;
for( i = 0; i < len1 - len2; i++)
{
if(*temp == *sub)
{
char *t = sub;
while(*t!='\0'&&(*t++ == *temp++));
if(*t == '\0')
{
break;
}
}
temp++;
}
if(i >= len1 - len2 )
{
return;
}
strcpy((*s)+(len1 - strlen(temp) - len2), temp);
del_sub_str(s, sub);
}

void main()
{
char *s = new char[1024];
temp = new char[1024];
char *t = temp;
strcpy(s, "abcdabbaabbkk");
del_sub_str(&s, "ab");
printf("%s\n", s);
delete s;
delete t;
}
...全文
75 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
华亭真人 2011-02-24
  • 打赏
  • 举报
回复
很好 很强大.
we_sky2008 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq120848369 的回复:]
提示楼主一点,不知道你关注没有,就是我举的例子,删除后可能还会出现新的sub,所以算法要谨慎,
[/Quote]
恩,确实会有这个问题,如果想去掉新出现的子串可以像下面这样:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char * del_substr(char *src, const char *sub)
{
int len;
char *dst = src;
char *temp = src;

if (src == NULL || sub == NULL)
return NULL;
len = strlen(sub);

while((temp = strstr(src, sub)) != NULL)//搜子串是从头开始搜索
{
strcpy(temp, temp + len);
}
return dst;
}

int main()
{
char a[] = "aaaaabbbbbbbbcccc";
char b[] = "bc";

printf("%s\n", del_substr(a, b));

system("pause");
return 0;
}

we_sky2008 2011-02-24
  • 打赏
  • 举报
回复
不使用库函数可以这么写:

char * del_substr(char *src, const char *sub)
{
char *pslow = src;
char *pfast = src;

if (src == NULL)
return NULL;
if (sub == NULL || !*sub)
return src;

for (;;)
{
if (*pfast == *sub)
{
char *psrc = pfast;
const char *psub = sub;

while (*++psrc == *++psub)
{
if (!*psub)
{
*pslow = 0;
return src;
}
}
if (!*psub)
pfast = psrc;
else
while(psub-- > sub)
*pslow++ = *pfast++;
}
else
if (!(*pslow++ = *pfast++))
return src;
}
}
we_sky2008 2011-02-24
  • 打赏
  • 举报
回复

char * del_substr(char *src, const char *sub)
{
int len;
char *dst = src;
char *temp = src;

if (src == NULL || sub == NULL)
return NULL;
len = strlen(sub);

while((temp = strstr(temp, sub)) != NULL)
{
strcpy(temp, temp + len);
}
return dst;
}
qq120848369 2011-02-24
  • 打赏
  • 举报
回复
提示楼主一点,不知道你关注没有,就是我举的例子,删除后可能还会出现新的sub,所以算法要谨慎,
qq120848369 2011-02-24
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* findSub(char *str,const char *sub) //找子串
{
size_t lenStr=strlen(str),lenSub=strlen(sub);

for(size_t j=0;j<=lenStr-lenSub;++str,++j)
{
size_t i;

for(i=0;sub[i]!=0;++i)
{
if(str[i]!=sub[i])
{
break;
}
}

if(sub[i]==0)
{
return str;
}
}

return NULL;
}

char* delSubStr(char *str,const char *sub) //用户接口
{
char *ret=str;

str=findSub(ret,sub);

while(str!=NULL)
{
char *s;

for(s=str+strlen(sub);*s!=0;++s)
{
*(s-strlen(sub))=*s;
}

*(s-strlen(sub))=0;
str=findSub(ret,sub);
}

return ret;
}

int main()
{
char a[]="aaaaabbbbbbbbcccc";
char b[]="bc";
printf("%s\n",delSubStr(a,b));

return 0;
}


不做什么优化了,就这样能用.
华亭真人 2011-02-24
  • 打赏
  • 举报
回复
呵呵, delete 老是出错,希望大家给出更好的代码。
昵称很不好取 2011-02-24
  • 打赏
  • 举报
回复
怎么还用了一个全局变量

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧