简单的串的应用( 串的删除,删除与m相同的子串)

zsplx1111 2010-05-12 12:00:01
问题见红字

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//函数声明
int index(char *s, char *t,int pos);
void delete_s(char *s,char *m) ;
//函数定义


void delete_s(char *s,char *m) // 串的删除,删除与m相同的子串
{
int i,k,po,sl,ml;
sl=strlen(s); ml=strlen(m);
printf("\n串s的长度是:=%d 串m的长度是:=%d\n",sl,ml);
po=0;
k=index(s,m,po);
if(k==-1)
printf("\n主串s中没有t字符串,原字符串不变");
else
{
while( po< sl-ml+1)
{
k=index(s,m,po); //调用串匹配函数,找到子串t在主串s的pos开始之后首次出现的位置
printf("\n k=%d",k);
i=k-1;
for(i=k-1;i<sl-ml;i++) { s[i]=s[i+1];} //怎么只移动了一位,我想删除与串m:abc相同的子串,后面的依次往前覆盖
po=k+ml;
//???怎么删除移位后剩余的元素
++po;
}
}
}

//从主串s的第pos个字符开始查找子串t,函数结果是子串m在主串s的pos开始之后首次出现的位置
int index(char *s, char *t, int pos)
{
int i,j,sl,tl;
i=pos; j=1; sl=strlen(s); tl=strlen(t);
while(i<=sl && j<=tl)
if(s[i-1]==t[j-1]) {i++; j++; }
else { i=i-j+1+1; j=1;}
if(j>tl) return(i-tl);
else return(-1);
}

/* 主函数 */
void main()
{ char *s,t[]="aaa",*m="abc";
s=(char *)malloc(100*sizeof(char));
printf("\n 请输入原始串s:"); gets(s); printf("\n s=%s\n",s);


printf("\n2、 m=%s\n",t,m);
delete_s(s,m);
printf("\n\n 删除串t后的字符串是:%s\n",s);
}

...全文
196 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsplx1111 2010-06-02
  • 打赏
  • 举报
回复
错了错了,上面是置换的函数
这回是对的,删除与m相同的子串

void delete_s(char *s,char *m)                  // 串的置换,将主串s中的t串,置换为v串
{
int i,k,po,sl,ml,j;
sl=strlen(s); ml=strlen(m);
printf("\n串s的长度是:=%d 串m的长度是:=%d\n",sl,ml);
po=0;
k=index(s,m,po);
if(k==-1)
printf("\n主串s中没有m字符串,原字符串不变");
else
{
while( po< sl-ml+1)
{
k=index(s,m,po); //调用串匹配函数,找到子串t在主串s的pos开始之后首次出现的位置
printf("\n k=%d",k);
for(i=0;i<ml;i++) { s[k-1]=s[k+ml-1];k++;}
sl=sl-ml;
po=po+ml;
}
}
}
zsplx1111 2010-06-02
  • 打赏
  • 举报
回复
我又把算法想了想,总算想清楚了,谢谢楼上的回复,虽说没解除我的疑问

void replace(char *s,char *t,char *v)                  // 串的置换,将主串s中的t串,置换为v串
{ int i,j,k,po,sl,tl;
sl=strlen(s); tl=strlen(t);
printf("\n串s的长度是:=%d 串t的长度是:=%d\n",sl,tl);
po=0;
k=index(s,t,po);
if(k==-1)
printf("\n主串s中没有t字符串,原字符串不变");
else
{
while( po< sl-tl+1)
{
k=index(s,t,po); //调用串匹配函数,找到子串t在主串s的pos开始之后首次出现的位置
printf("\n k=%2d",k);
i=k-1;
for(j=0;j<=tl-1;j++) { s[i]=v[j];i++;}
po=k+tl;
printf(" pos=%2d",po);
po++;
}
}
}
zsplx1111 2010-06-02
  • 打赏
  • 举报
回复
我是屏幕输入字符串s,删除s中含有m的子母,与t无关,那个t是我做的另一个函数的应用
gets(s);
delete_s(s,m);
此外你的第二个回复没看懂?能帮我改下程序吗
小楫轻舟 2010-06-02
  • 打赏
  • 举报
回复
关于移位后的删除,用s[nouse] = '\0';
小楫轻舟 2010-06-02
  • 打赏
  • 举报
回复
char *s,t[]="aaa",*m="abc";

你测试字符串有点不合适,用
char *s,t[]="sssabcsss",*m="abc";

试试
zsplx1111 2010-06-02
  • 打赏
  • 举报
回复
没人?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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