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;
}
posted @ 2023-03-17 14:47  十豆加日月  阅读(26)  评论(0编辑  收藏  举报