C语言删除句子中的单词(遍历一次)

    上次的代码,Poppy利用拆解的方式通过简化解决了问题,但是会遍历两次字符串,不符合循环最少原则,这次通过另一种思想,用更少的循环解决问题,不过代码貌似还是有点冗长,,大家忍着看吧。。。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 理解为"能够"“开罐”“罐子”。。。停停停,,重点不是代码吗。。。

猜你喜欢

转载自blog.csdn.net/Poppy991122/article/details/80031867