因为在C语言标准(C89)没有定义布尔类型,所以会报错。
而C99提供了一个头文件<stdbool.h>
定义了bool
,true
代表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;
}