1033 旧键盘打字 (20分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
审题
字符串处理题,输入两个字符串,第一个字符串的字母都是大写,第二个字符串中有小写字母和大写字母。两个字符串都可以包含题中所给的特殊符号。输出结果要求输出第二个字符串中除去第一个字符串中的所含字符后的字符串。如果第一个字符串中有‘+’,则输出结果中不能包含大写字母。
思路
-
判断第一个字符串中是否含有’+‘,如有,将第二行字符串中大写字母去掉。
-
遍历第一个字符串,将第一个字符串中字符和第二个字符串中字符配对,如果相同(注意大小写)则删去第二个字符串中的该字符。
-
这里删除一个字符可用题中所给字符之外的字符代替待删除字符,模拟删除的过程
参考代码
1 #include<iostream> 2 #include<string> 3 #include<string.h> 4 using namespace std; 5 6 int main() 7 { 8 string a,b; 9 getline(cin,a); 10 getline(cin,b); 11 for(int i=0;i<a.length();i++){ 12 if(a[i]=='+'){ 13 for(int k=0;k<b.length();k++){ 14 if(b[k]>='A'&&b[k]<='Z'){ 15 b[k]=' '; 16 } 17 } 18 } 19 } 20 for(int i=0;i<a.length();i++){ 21 for(int j=0;j<b.length();j++){ 22 //if(a[i]==b[j]||a[i]==(char)(b[j]-32)) 23 if(a[i]==b[j]||tolower(a[i])==tolower(b[j])){ 24 b[j]=' '; 25 } 26 } 27 } 28 for(int i=0;i<b.length();i++){ 29 if(b[i]!=' '){ 30 cout<<b[i]; 31 } 32 } 33 }
总结
第一次用if(a[i]==b[j]||a[i]==(char)(b[j]-32))来判断相同的字母(不分大小写)出现错误。思考后发现a[i]==(char)(b[j]-32)),这里a[i]和b[j]可以是不同的特殊字符,ascii码差值为32。因此改用tolower()将两者都转为小写比较。
C++语言中tolower()函数是把字符串都转化为小写字母;
touppre()函数是把字符串都转化为大写字母。
这两个函数的声明在头文件<cctype>中,但是经过测试,如果不包含头文件<cctype>仅仅有<iostream>也是可以的。
坑点
注意题目第一行可以不输入字符串,这里的换行符读入要处理一下。