1033 旧键盘打字 (20 分)
题目
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 10^5
个字符的串。可用的字符包括字母 [a-z, A-Z]、数字 0-9、以及下划线 _(代表空格)、,、.、-、+(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
分析一
遍历输出的代码,将其与坏掉的比对(注意坏掉的英文字符以大写形式出现,要注意比较时将输出的英文字母变成大写的),用另外一个数组来存储与其不同的字符,其次,判断是否有加号,输出时大写英文字母不输出
代码一
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char a[1000000],b[1000000];
gets(a);
gets(b);//a存储坏掉的,b存储输入的数据
char c[1000000];
int i,j=0,q=0;
int tem=1;
for(i=0;b[i]!='\0';i++)//遍历输入的字符
{
for(j=0;a[j]!='\0';j++)
{
if(toupper(b[i])==a[j])//如果字符与坏掉的相同
{
tem=0;
break;
}
}
if(a[j]=='\0')//表明字符与坏掉的字符不同
{
c[q++]=b[i];
}
}
//下面判断是否存在上档键,去掉大写大写字母
int m=0,flag=0;
for(i=0;a[i]!='\0';i++)
{
if(a[i]=='+')
{
flag=1;
break;
}
}
for(i=0;c[i]!='\0';i++)
if(!(flag&&isupper(c[i])))
printf("%c",c[i]);
}
分析二
遍历坏掉的字符,除去文字中字符相同的(小写的英文字符比较时要转换成大写的),其次判断有无加号,判断大写英文字符是否可以输出
代码二
#include<stdio.h>
#include<ctype.h>
int main()
{
char a[100005];//存坏掉的字符
char b[100005];//存输入的文字
gets(a);
gets(b);
int i,j,q;
for(i=0;a[i]!='\0';i++)//遍历坏掉的字符
{
q=0;
for(j=0;b[j]!='\0';j++)//遍历输入的字符
{
if(a[i]!=toupper(b[j]))//两者大写不相同
{
b[q++]=b[j];
}
}
b[q]='\0';
}
int flag=1;
for(i=0;flag&&a[i]!='\0';i++)
{
if(a[i]=='+')//有加号时,不可输出大写字母
{
for(j=0;b[j]!='\0';j++)
{
if(b[j]<'A'||b[j]>'Z')
{
printf("%c",b[j]);
}
}
flag=0;
}
}
if(flag)//表明不存在加号
{
printf("%s",b);
}
printf("\n");
}