C语言实现删除字符串中的子串,基础编程由此开始(第二十六节)

今天这道题目呢,难度有所提升,当然,这里的难度可不是指逻辑上的难度,而是指对C语言的一个库函数的熟悉程度,如果很熟悉的话,完成这道题目就不难。

可相反,正是因为我对库函数的一个不熟悉,才导致我出错了。

我们先来看看这道题目的要求:输入字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含字符串S2。

(注意:输入在两行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2)。

梳理逻辑

1、输入两个字符串S1和S2,这里我们是用字符型数组来存储字符串S1和字符串S2,由于题目要求说字符长度要不超过80,所以我们给定的数组长度应该为81,因为数组下标是从0开始的,如果设定为80的话,容易导致数组下标越界,这是很容易出现的一个问题。

这边还要再讨论一个问题,我们都知道,字符串是可以包含空格的,而scanf函数遇到空格就会结束,我们可以使用之前的那个scanf函数表达式来表达,但这只能输入一个字符串S1,至于字符串S2输入后就会产生问题。

所以综合考虑,我打算使用gets函数,因为gets函数只有当按下回车键的时候才会停止,而且不用像scanf函数一样考虑那么多,更为方便。

    char S1[81];
    char S2[81];
    gets(S1);
    gets(S2);

2、要删除字符串S1当中的子串S2,我们要先去寻找字符串S1当中是否包含子串S2,可子串S2只是属于字符串S1当中的一部分,这该如何考虑呢。

此时,我们就要想到C语言当中的库函数了,能够熟练应用库函数,对于我们解决这道题目有着很大的帮助。

这道题首先需要用到的函数就是strstr(s1,s2)函数,它的主要作用就是返回一个指针,指向字符串S1中的字符串S2第一次出现的位置,那么我们只需要判断该位置是否为空即可,如果不为空,则继续接下来的步骤,反之,如果为空,就跳出该循环。

注意,不要忘了头文件#include<string.h>,有这个存在的前提下,strstr函数才能调用。

    while(strstr(S1,S2)!=NULL){
        
    }

3、接下来我们就要记录下字符串S2在字符串S1当中的位置了,因为该函数的主要作用是返回一个指针,所以我们如果要用变量来表示的话,也要用指针来表示。

而字符型指针变量的定义,就是要在字母前面添加一个星号*,也就是用char *place来表示,当然,此时的place指的是指针,也就是变量的地址,而如果要返回变量的值,则需要再用一个星号来进行表示,比方说实际在代码中用*place来表示变量的值。

这道题目最关键的部分就是删除部分,我们在字符串S1当中找到字符串S2之后,该如何来删除字符串S2呢,这是一个值得思考的问题。

此时我们已经用strstr函数在字符串S1中找到了字符串S2,并且用指针记录下了它的位置,此时我们要把在字符串S1当中的字符串S2给删除,可是如果直接用'\0'停止的话,因为它是一个结束标志,所以在字符串S1当中的字符串S2之后全部都会删除。

所以进行一个删除俨然是比较困难的,我这里也没有想到更好的办法,如果大家有更好的办法的话,欢迎在评论区留下自己的留言。

我在网上查阅相关资料后,发现了另一个办法,就是跳过字符串S2这一段,进行下一次查找,以题目中给出的例子为例。

而要进行跳过的话,我们只需要判断当前字符串是否结束,在没结束的前提下,继续进行循环,然后进行赋值即可。

while(*place!='\0'){//判断当前字符串S1当中的字符串S2是否为结束
            *place=*(place+lengthS2);//未结束就把当前字符串S1当中的字符串S2给去掉,或者说把后面那段给挪上来
            place++;//继续往后面走
        }

代码实现

//删除字符串中的子串
#include<stdio.h>
#include<string.h>
int main() {
    char S1[81];//字符串S1
    char S2[81];//字符串S2
    gets(S1);//输入字符串S1
    gets(S2);//输入字符串S2
    char *place;
    int lengthS2;//字符串S2的长度
    lengthS2 = strlen(S2);
    while(strstr(S1,S2)!=NULL){//判断字符串S1当中是否存在字符串S2
        place = strstr(S1,S2);
        while(*place!='\0'){//判断当前字符串S1当中的字符串S2是否为结束
            *place=*(place+lengthS2);//未结束就把当前字符串S1当中的字符串S2给去掉,或者说把后面那段给挪上来
            place++;//继续往后面走
        }
    }
    printf("%s",S1);//最后打印字符串S1
}

结果测试

总结

归根结底,这道题目是对C语言库函数的一个熟练应用,以及对指针的一个熟悉,如果能对库函数和指针有一个相对较为熟悉的了解的话,要解决这道题目也就没有那么复杂了。

原文链接:,转发请注明来源!