把字符串s1中与字符串s2中字符匹配的各个字符都删除掉,请高手帮忙写一下这个程序的流程

xvliang 2003-08-22 11:07:40
void squeeze(char s1[],char s2[])
{
int i,j,k;
for (i=k=0;s1[i]!='\0';i++){
for (j=0;s2[j]!='\0'&&s2[j]!=s1[i];j++)
;
if (s2[j]=='\0')这两句语句不了解有什么作用?
s1[k++]=s1[i]
}
s1[k]='\0'
}


...全文
555 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
leafxx 2003-08-23
  • 打赏
  • 举报
回复
以上代码在dev-C++ 4.9.7.0中调试通过
leafxx 2003-08-23
  • 打赏
  • 举报
回复
/*你的程序通用性不好,如果s1中有多个子串可以匹配s2,就不行了
我给出完整的
*/

#include <stdio.h>
#include <string.h>
#define PRIME 20
#define SUB 5

void main()
{
void Squeeze(char s1[], char s2[]);

char s1[PRIME]; /* 待处理字符串 */
char s2[SUB]; /* 子串 */

printf ("Enter a string: ");
gets (s1);
printf ("Enter a sub string: ");
gets (s2);

Squeeze(s1, s2);

printf ("Now:\n");
puts (s1);
getch();
}

void Squeeze(char cPrime[], char cSub[])
{
int i,j,w,k;
i=j=0;

while (cPrime[i]!='\0'){
if (cPrime[i] == cSub[j]){
++i; ++j;
}
else{
i = i-j+1; j=0;
}
if (cSub[j] == '\0'){
for (k=i-strlen(cSub),w=i; cPrime[w]!='\0'; ++k){
cPrime[k]=cPrime[w++];
}
cPrime[k]='\0';
}

}
return;
}
xvliang 2003-08-23
  • 打赏
  • 举报
回复
谢谢各位大哥!!
lth_81 2003-08-23
  • 打赏
  • 举报
回复
to leafxx(飘叶钴蓝_狂欢与静止):
不知道你的多个子串匹配的问题是什么意思?

他的函数处理是以单个字符为单位的。。
lth_81 2003-08-23
  • 打赏
  • 举报
回复
void squeeze(char s1[],char s2[])
{
int i,j,k;
for (i=k=0;s1[i]!='\0';i++){
//在这里设定i和k都是0,因此一定成立k<=i这个事实
for (j=0;s2[j]!='\0'&&s2[j]!=s1[i];j++)
;//如果遇到'\0'退出,如果遇到有在s2中有字符与当前s1的这个字符相同退出
if (s2[j]=='\0')
//如果s2是因为遇到'\0'退出,则表示s2中没有一个字符与s1当前的这个字符相同
s1[k++]=s1[i]
//前面已经说了k<=i因此这里就是重新创建新的s1字符数组,但是很巧妙的没有修改当前字符后的内容。
}
s1[k]='\0'//加上结束符
}

^_^
wowowowo 2003-08-22
  • 打赏
  • 举报
回复
if (s2[j]=='\0') s1[k++]=s1[i]
扫描过s2一边 没有和s1[i]相同的字符的话 就说明这个s1[i]是有用的
用来组成新的s1 所以k从0开始当每次找到组成新s1的元素后递增
并在此之前 将新的s1的元素插入s1
RookieStar 2003-08-22
  • 打赏
  • 举报
回复
void squeeze(char s1[],char s2[])
{
int i,j,k; //i遍历s1,j遍历s2,k是用来遍历s1中所有应保留的字符

for (i=k=0;s1[i]!='\0';i++)
{
for (j=0;s2[j]!='\0'&&s2[j]!=s1[i];j++); //在s2中查找与当前s1[i]相同者,找到就将j停在该位置

if (s2[j]=='\0) s1[k++]=s1[i]; //若上句得到的j是s2的尾的话(即s2中无当前的s1[i]),就令s1[k]=s1[i],k再递增直至s1全部遍历完毕。
}

s1[k]='\0'; //s1遍历完毕,去掉无用的尾巴,因为k值已经是新s1的最大下标了。(共有k个字符被保留)
}

自己好好体会一下!
tonybaobao 2003-08-22
  • 打赏
  • 举报
回复
晕,忘了改过来了,你把上面的代码当一个函数用好了。原本我是放在类里面的。
tonybaobao 2003-08-22
  • 打赏
  • 举报
回复
char* CRemove::remove(char* array, char* str)
{
int i=0;
int j=0;
static char temp[30];
memset(temp,'\0',30);//用'\0'填充字符数组的每一个单元
int num=strlen(str);
while(array[i]!='\0')
{ //用双重循环分别控制源字符串和待删字符串的下标
for(;array[i]==str[j];)//当待删字符串的第一个字符与源字符串某个字符匹配时进入循环
{
i++;
j++;
if(str[j]=='\0')//判断待删字符串是否结束
{
j=0; //如果待删字符串已经结束,让其归零,指针指向首单元
for(int k=i-num;k<=i-1;k++) //将源字符串中匹配的子字符串填充标记
array[k]='`';
}
}
i++;
}
for(i=0,j=0;array[i]!='\0';)//跳过标记,输出结果
{
if(array[i]!='`') temp[j++]=array[i++];
else i++;
}
return temp;
}

这是我以前写的一段代码,原理是把原字符串中匹配的字符串用`代替,然后跳过再输出。问题就是不能有这个`字符。
visio 2003-08-22
  • 打赏
  • 举报
回复
应该是字符串吧
Marffin 2003-08-22
  • 打赏
  • 举报
回复
没明白楼主的意思,如果s2中包含了所有26个英文字母,那……s1不是被删光了?

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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