PAT Basic 1033. 旧键盘打字
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;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号