codeup100000580问题 C: 字符串的查找删除
题目描述
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
样例输入 Copy
in
#include
int main()
{
printf(" Hi ");
}
样例输出 Copy
#clude
tma()
{
prtf(“Hi”);
}
提示
注:将字符串中的In、IN、iN、in删除。
题目链接
http://codeup.cn/problem.php?cid=100000580&pid=2
本题属于字符串处理问题,对我这种编程菜鸡(初学)并不是很友好,但是也写一些感悟与总结以便自己复习提高。
思路如下:
1>输入处理:
短串因为只输入一个所以随便输入即可
需要删除处理的长串涉及到空格,回车,多行,因此可以考虑用多点测试方法输入
这里需要注意scanf("%s",str)和gets(str)的区别,前者在控制台输入时以空格或者回车作为一个字符串结束,而后者识别回车但是不识别空格,这里推荐每行输入整体作为一个字符串去处理类似这种int main()的情况,为了把中间的空格也识别到,用gets更好,免去很多处理步骤
2>处理过程:
大致思想即为:我拿着大串str去挨个字符对照小串的第一个字符ch[0],只要不匹配且不是空格,我就直接把这一位字符输出即可;如果发现匹配了,那么再进一层循环,大串和小串同时按位比较(具体处理见代码部分即注释部分)
#include <stdio.h>
#include <string.h>
#include <math.h>
char ch[10],str[50];
int main() {
scanf("%s",ch);
getchar(); //接收一下输入ch后的回车,否则这个回车将被接收在str[]的第一行,导致程序进入while循环而输出一空行
int len=strlen(ch);
while (gets(str)) {
int len1=strlen(str);
int i,k,j;
for(i=0; i<len1; i++) { // 每个str[i]先与ch[0]匹配
if(fabs(str[i]-ch[0])==0||fabs(str[i]-ch[0])==32) { //不区分大小写匹配;
int m=0;
k=0; //k标记小串的头
while (k<len) {
if(fabs(str[i]-ch[k])==0||fabs(str[i]-ch[k])==32) {
i++; //str后移
k++; //ch后移
m++; //m记录失败后i的回退位数
} else
break; //有一位不匹配直接退出
}
if(k==len)
i--; //i回退一,因为for 循环i还要加一,i前面的len位要删除(不输出)
else {
for(j=0; j<m; j++)
i--;
printf("%c",str[i]); //只要在0<=k<len之间有一位不匹配,即i的前m位不能删(都得输出)
}
} else { //不匹配即不用删除,直接过滤掉空格输出
if(str[i]!=' ')
printf("%c",str[i]);
}
}
printf("\n");
}
return 0;
}
注:1>字符串声明放main 外面,否则可能出现运行错误;main函数在运行时尽量不要申请太大的空间
2>代码开头的getchar();如果不要,会是这种结果:
第二行本来要输入str但是gets把空行接收成一个字符串进入了循环导致先输了个空行。
3>提供几个测试结果:
4>本题输出结果: