上次的代码,我利用拆解的方式通过简化解决了问题,但是会遍历两次字符串,不符合循环最少原则,这次通过另一种思想,用更少的循环解决问题,不过代码貌似还是有点冗长,,大家忍着看吧。。。O(∩_∩)O
#include<stdio.h>
#include<stdlib.h>
#define M 100
int my_strlen(char a[]);
void Find(char a[],char *find,int k); //函数声明
int main()
{
int i,j,k;
char a[M],find[M];
scanf("%[^\n]",a); //输入任意字符串
printf("请输入需要删去的词汇:");
scanf("%s",find);
k=my_strlen(find);
Find(a,find,k);
system("pause");
return 0;
}
void Find(char a[],char *find,int k)
{
int i,j,m,n;
char *p=find;
m=my_strlen(a);
for(j=0;a[j]!='\0';j++) //直至读到'\0'时停止
{
if(a[j]==*p) //逐个字符判断是否相同
{
p++; //若相同,继续判断下一个字符
if(*p==NULL&&*(a+j+1)==' '||*(a+j+1)==NULL) //find和a中的某一字符串同时读取完毕时视为相同
{
if((j+k)>m) //若所要删除的字符串为该句子最后一个字符串,则如下执行
{
a[j-k+1]='\0'; //使输出提前中止
}
else //若所要删除的字符串不为该句子最后一个字符串
{
for(i=j+1;i<m;i++)
{
a[i-k-1]=a[i]; //使字符串整体前移
}
a[m-k-1]='\0';
j=j-k;
p=find; //使指针回位
m=my_strlen(a); //重新测取字符串长度
}
}
}
else
{
p=find; //若a中某个单词与find不完全相同,指针回位
}
}
puts(a);
}
int my_strlen(char a[])
{
int i,k=0;
for(i=0;a[i]!='\0';i++)
{
k++;
}
return k;
}
下面是示例。。这么多can(lll¬ω¬)
Ps. can 理解为"能够"“开罐”“罐子”。。。停停停,,重点不是代码吗。。。