输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat输出样例:
Tom is a male
#include <stdio.h>
#include <string.h>
int main()
{
char s1[81] = { '\0' }, s2[81] = { '\0' };
gets(s1);
gets(s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
int i;
for (i = 0; i < len1 - len2 + 1; i++)
{
if (s1[i] == s2[0]) //找到s1字符串中最先出现s2首字符的位置
{
int j, k, same = 1;
for (j = i + 1, k = 1; j < len2 + i; j++, k++) //检查s1该位置开始相同长度的字符串是否与s2字符串完全相同
{
if (s1[j] != s2[k])
{
same = 0;
break;
}
}
if (same == 1) //若完全相同,开始删除
{
for (j = i; j < len2 + i; j++) //待删除区域均用空字符替换
{
s1[j] = '\0';
}
for (j = i; j < len1 - len2; j++) //将原待删除区域后的所有字符前移,与前面的字符串合并
{
s1[j] = s1[j + len2];
}
i = -1, len1 -= len2; //考虑嵌套,须重新检查
}
}
}
for (i = 0; i < len1; i++) //输出结果
{
printf("%c", s1[i]);
}
return 0;
}
注意事项:
最后输出结果,若使用printf函数,会受到空格和空字符的影响,若使用puts函数,会受到空字符的影响,故利用循环将结果逐字符输出。
如有问题,欢迎提出。