思路:
err串用于存放坏键,input串存放待输入串;
遍历err串,在遍历一个err串时,同时遍历input串,看是input串是否含有err串的字符,如果有则用特殊字符替换(这里我使用'*'替换),整个遍历完成后,遍历输出input串,遇到'*'就不输出!
看了解析后,解析思路:
利用string类型的find()函数,只需遍历input串,如果input[i]在err串中,则不输出,否则输出;
代码如下,两个思想都写在了里面,注释了解析思路,提交使用g++
#include<bits/stdc++.h>
using namespace std;
int main()
{
string err, input;
int lenErr, lenInput;
int count = 0;
getline(cin, err);
getline(cin, input);
lenErr = err.length();
lenInput = input.length();
/*解析思路*/
// for(int i=0; i<lenInput; i++)
// {
// if(err.find(toupper(input[i]))!=string::npos) continue;
// if(isupper(input[i])&&err.find('+')!=string::npos) continue;
// printf("%c", input[i]);
// }
/*自己的思路*/
for(int i=0; i<lenErr; i++)
{
for(int j=0; j<lenInput; j++)
{
if((err[i]=='_'||err[i]==','||err[i]=='.'||err[i]=='-'||isdigit(err[i]))
&&err[i]==input[j])
{
input[j] = '*';
}
if(err[i]==toupper(input[j]))
{
input[j] = '*';
}
if(err[i]=='+'&&isupper(input[j]))
{
input[j] = '*';
}
}
}
//这两个 for 循环加下面控制输出代码,等价最上面注释的一个 for 循环
count=0;
for(int i=0; i<lenInput; i++)
{
if(input[i]=='*')
count++;
}
if(count==lenInput)
printf("\n");
else
{
for(int i=0; i<lenInput; i++)
{
if(input[i]!='*')
printf("%c", input[i]);
}
}
return 0;
}
【Debug过程】:自己的逻辑没有问题,问题出在输入上,以后记住:如果题目输入多行string,最好用getline( cin, string);
【补漏】:string类find()与 string::npos的用法,find不仅可以判断单个字符,也可以判断字符串是否为比较字符的子串,同时还可以设定判断起始位置!另外字符串可以直接比较,比较规则为【字典序】,像Q1028人口普查题,判断出生年月日是否在规定范围内,直接>=和<=比较即可;
【补漏】:ctype库中好用的函数有:is系列(isalnum, isalpha, islower, isupper, isdigit); to系列(toupper, tolower)
ctype文件包含库函数简单明了版:
https://blog.youkuaiyun.com/zhouhongkai06/article/details/79050856
本文介绍了一种使用C++实现的字符串过滤算法,通过遍历错误字符串并替换输入字符串中的匹配字符,最终输出未被标记的字符。文章详细解释了两种实现思路:一是使用特殊字符替换,二是利用string类型find()函数进行高效判断。此外,还补充了string类find()函数与string::npos的用法,以及ctype库中is系列和to系列函数的使用。
214

被折叠的 条评论
为什么被折叠?



