原题干:
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在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;
} 
			 
				

