字符串的查找删除

题目描述

给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。

输入

输入只有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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值