PAT Basic 1033. 旧键盘打字
1. 题目描述:
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
2. 输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 \(10^5\) 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
3. 输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
4. 输入样例:
7+IE.
7_This_is_a_test.
5. 输出样例:
_hs_s_a_tst
6. 性能要求:
Code Size Limit
16 KB
Time Limit
200 ms
Memory Limit
64 MB
思路:
遍历输入字符串,判断是否坏键,生成输出字符串即可,这里需要额外处理的就是上档键,定义了标志capBroken,上档键坏了则所有大写字母都不能输出。
另外一个bug点就是可能没有坏键,即第一个输入是空字符串,最开始我用scanf()
读入时会导致输入错误,后面改成使用fgets()
库函数。
编写程序的关键在于弄清楚输入、输出,以及如何从输入获得输出。
My Code:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char broken[42]; // 'A-Z' '0-9' '_' ',' '.' '-' '+' 26+10+5 = 41
char in[100001];
char out[100001] = "";
int i, capBroken = 0;
char * pchar;
//scanf("%s%s", broken, in);
// scanf("%s", broken);
// scanf("%s", in);
// gets(broken);
// gets(in);
//char *fgets(char *buf, int bufsize, FILE *stream);
fgets(broken, 42, stdin); // first submit testpoint2 reject, for broken maybe null, thus scanf can't get correct input.
fgets(in, 100001, stdin);
// if(strcmp(in, ""))
// {
// }
// printf("broken: %s\nin: %s", broken, in);
//char *strchr(const char *str, int c)
if(strchr(broken, '+'))
{
capBroken = 1; // cap key broken
}
pchar = out;
for(i=0; in[i] != '\0'; i++)
{
//int toupper(int c);
if(strchr(broken, toupper(in[i]))) //in[i] is a broken key
{
continue;
}
else if(in[i] >= 'A' && in[i] <= 'Z' && capBroken)
{
continue;
}
*pchar = in[i];
pchar++;
}
*pchar = '\0';
printf("%s\n", out);
return 0;
}
标签:输出,PAT,int,scanf,char,broken,Basic,1033,输入
From: https://www.cnblogs.com/tacticKing/p/17226769.html