题目描述
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
样例
输入
in
#include
int main()
{
printf(" Hi ");
}
输出
#clude
tma()
{
prtf(“Hi”);
}
提示
注:将字符串中的In、IN、iN、in删除。
思路
首先,需要输入待删除字符串字样,因为需要删除所有的大小写匹配的字符串,所以先将输入的删除的字符串全部变成小写。
然后采用二维数组存储存储需要处理的字符串,这里需要注意使用gets函数吸收输入的字符串,如果使用scanf遇到空格就会自动跳过。
输入完毕后,开始处理。在输入过程中,已经通过index记录了总计包含了多少字符串,遍历二维数组,将不变的先存储到另一个数组中,然后将自身变成小写继续存储(以备下面的大小写一样匹配)
然后继续遍历二维,开始字符串匹配。(这是核心)
for(int j = 0, k=0; j<len2;) {
if(str[i][j+k] == del[k]) {
k++;
if(k == len1) {
j = j+ k;
k = 0;
}
} else {
if(str[i][j] != ' ') {
printf("%c",ans[i][j]);
}
j++;
k = 0;
}
}
这里使用的是字符串的简单模式匹配,定义一个k,每次都从第0 个位置开始匹配,若果匹配上了,继续往后走,直到k达到了待删除字符串的长度。一旦某个位置发生失配,就要回到起点位置,看看当前位置是不是为空,如果不为空,输出最原先的字符,否则往后走一位。
完整代码展示
#include <cstdio>
#include <cstring>
char del[1000], str[1001][1001], ans[1001][1001];
int main() {
int index = 0;
gets (del);
int len1 = strlen (del);
for(int i = 0; i < len1; i++) { //全部转化为小写字母;
if(del[i] >= 'A' && del[i] <= 'Z') {
del[i] = del[i] - 'A' + 'a';
}
}
while (gets (str[index++])); //读入数据;
for(int i = 0; i < index; i++) {
int len2 = strlen (str[i]);
for (int j = 0; j < len2; j++) {
ans[i][j] = str[i][j]; //用另一数组存储原数据,然后将其转化为小写字母;
if (str[i][j] >= 'A' && str[i][j] <= 'Z') {
str[i][j] = str[i][j] - 'A' + 'a';
}
}
for (int j = 0, k = 0; j < len2; ) {
if (str[i][j + k] == del[k]) { //判断是否与短字符第一个字符相同;
k++;
if (k == len1) { //若完全相同则跳过;
j = j + k;
k = 0;
}
} else {
if (str[i][j] != ' ')
printf ("%c", ans[i][j]); //输出原字符;
j++;
k = 0;
}
}
printf ("\n");
}
return 0;
}