算法笔记练习 3.6 字符串处理 问题 C:字符串的查找删除

算法笔记练习 题解合集

题目链接

题目

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

输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。

输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。

样例输入
in
#include
int main()
{

printf(" Hi ");
}

样例输出
#clude
tma()
{

prtf(“Hi”);
}

思路

  1. 读入短字符串 word,并全部小写处理
  2. 用 input 字符数组逐行读入数据,对每一行数据用字符指针 p 遍历
  3. 当 *p 与 word 首字符匹配时,检查后面的字符是否与 word 完全匹配,若匹配则指针 p 向后跳过 word 的长度,跳过时注意检查数组是否会越界
  4. 若不匹配,且不是空格,则正常输出该字符,继续遍历

坑:

  1. *p 和 word 首字符匹配时,我用了 lowerp 来保存 *p的副本,正常输出记得要用 *p
  2. 一开始用 while (fgets(input, MAX, stdin)) 来读入数据时一直答案错误,但是自己本地测试了很多数据都没问题(包括后面的代码也针对 fgets 的特点修改了),后来换成 gets 就AC了,猜测是 fgets 限定输入流为 stdin 导致出现问题,有大神看到的话希望能指点一下 😃

代码

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX 2000
// compare_n_char接收两个字符串的首地址,比较他们的前n个字符是否相同
// 相同返回1,不同或者其中一个字符串长度小于n,返回0
int compare_n_char(char *str1, char *str2, int n); 
int main(){
	int i;
	char word[MAX];  // 保存要删除的短字符串 
	char input[MAX]; // 保存每一行的数据 
	scanf("%s", word);
	getchar(); 
	// 把短字符串改为全小写以便比较 
	int lenword = strlen(word);
	for (i = 0; i < lenword; ++i)
		word[i] = tolower(word[i]);
	// 逐行读入并输出 
	while (gets(input)){
		char *p = input;
		while (*p){
			// lowerp为*p的小写副本 
			char lowerp = tolower(*p);
			if (lowerp != word[0] && lowerp != ' '){ // 和word首字母不同且不是空格,输出
				putchar(*p);
			} else if (lowerp == word[0]){ // 和word首字母相同,开始匹配剩余字符 
				if (compare_n_char(p, word, lenword)){ // 匹配成功,跳过word的长度 
					for (i = 0; i < lenword; ++i){
						++p;
						if (*p == '\0') // 跳过的时候检查是否越界 
							break; 
					}
					continue;
				} else { 				// 匹配失败,正常输出 
					putchar(*p);
				} 
			}
			++p;
		}
		printf("\n"); 
	} 
	return 0;
}

int compare_n_char(char *str1, char *str2, int n){
	int ret = 1;
	while(n--){
		if(tolower(*str1) != tolower(*str2)
			|| *str1 == '\0' || *str2 == '\0'){
			ret = 0;
			break;
		}
		++str1;
		++str2;
	}
	return ret;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值