原题干:
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过105个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线"_"(代表空格)、","、"."、"-"、"+"(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE. 7_This_is_a_test.
输出样例:
_hs_s_a_tst
首先千万记住这些。。。。血的教训。。
这里要注意这么几点:首先小写转大写的时候注意判断不要出错,一般用char型的字符+32,即可转换成小写。但是这样会有一个小小的弊病,例如'k'+32 = '+'。
还有一点需要注意的就是题目并没有说第一行不为空,如果第一行为空就不能用cin进行读取了。(亲测有一个测试点是第一行为空的)。这里我们用getline(cin,[variable])来读取一整行字符串。
上代码:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
bool isUper(char s) {
return ((s >= 'A') && (s <= 'Z'));
}
string killShift(string str) {
string result = "";
for(int i = 0; i < str.length(); i++) {
if(!isUper(str[i]))
result += str[i];
}
return result;
}
char lower(char s) {
if(isUper(s))
return (char)(s + 32);
else return s;
}
string killLetter(string str, char s) {
string result;
for(int i = 0; i < str.length(); i++) {
if((str[i] != s) && (str[i] != lower(s)))
result += str[i];
}
return result;
}
int main() {
string str, broken;
getline(cin, broken); //为了防止第一行是空的
getline(cin, str);
if(broken.find('+') != string::npos) {
str = killShift(str);
broken = killLetter(broken, '+');
}
for(int i = 0; i < broken.length(); i++) {
str = killLetter(str, broken[i]);
}
cout << str;
if(str == "")
cout<<endl;
return 0;
}