算法笔记练习 3.6 字符串处理 问题 C:字符串的查找删除
题目
题目描述
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
样例输入
in
#include
int main()
{
printf(" Hi ");
}
样例输出
#clude
tma()
{
prtf(“Hi”);
}
思路
- 读入短字符串 word,并全部小写处理
- 用 input 字符数组逐行读入数据,对每一行数据用字符指针 p 遍历
- 当 *p 与 word 首字符匹配时,检查后面的字符是否与 word 完全匹配,若匹配则指针 p 向后跳过 word 的长度,跳过时注意检查数组是否会越界
- 若不匹配,且不是空格,则正常输出该字符,继续遍历
坑:
- *p 和 word 首字符匹配时,我用了 lowerp 来保存 *p的副本,正常输出记得要用 *p
- 一开始用 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;
}