思路:
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.csdn.net/zhouhongkai06/article/details/79050856