吉大考研复试准备-PTA7-29 删除字符串中的子串

文章讲述了在C语言中如何使用C99的stdbool.h库处理布尔类型,并介绍了一个基于字符匹配的字符串删除算法,包括处理边界情况和避免死循环的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为在C语言标准(C89)没有定义布尔类型,所以会报错。

而C99提供了一个头文件<stdbool.h>定义了booltrue代表1,false代表0。只要导入stdbool.h,就能非常方便的操作布尔类型了。

1. 基本思路是遍历,然后每一次都按位匹配,匹配成功移动元素

2. 这个题一个不太好处理的地方在于删掉一层之后以前可能不是目标串的字符串可以被删除了。出现这种情况,使用一个while循环套在遍历字符串的for循环的外层。当出现删除的时候,flag设置为true,然后退出循环重新检测。

3. 如果本次遍历没有删除操作,说明不会出现套一层的情况,flag设置为flase,结束循环并且输出。

4. 一个边界情况是全部删空,这样会死循环,因为flag就一直是true了,第一次错了。在for外侧加一个判断空的语句即可解决

#include <stdio.h>
#include<stdlib.h>
#include <stdbool.h>

bool judge(char*s1,char*s2);
int getlen(char s[]);

int main()
{
    char s1[100],s2[100];
    gets(s1);
    gets(s2);
    int len=getlen(s2);
    bool flag=true;

    while(flag)
    {
        for(int i=0;s1[i]!='\0';i++)
        {
            if(judge(s1+i,s2))//有s2字串,删除
            {
                int k;
                for(k=i+len;s1[k]!='\0';k++)
                    s1[k-len]=s1[k];
                s1[k-len]=s1[k];

                i--;//退一位,这样下一轮不会漏掉第一次移动的字符
                flag=true;
                break;
            }
            else
                flag=false;
        }

        if(s1[0]=='\0')//判空
            break;
    }

    puts(s1);
    return 0;
}

bool judge(char*s1,char*s2)
{
    int i;
    for(i=0;s1[i]!='\0'&&s2[i]!='\0';i++)
        if(s1[i]!=s2[i])
        break;
    if(s2[i]=='\0')
        return true;
    else
        return false;
}

int getlen(char s[])
{
    int i;
    for(i=0;s[i]!='\0';i++);
    return i;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值