我的PAT系列文章更新重心已移至Github,歡迎來看PAT題解的小伙伴請到Github Pages瀏覽最新內(nèi)容炮障。此處文章目前已更新至與Github Pages同步目派。歡迎star我的repo。
題目
舊鍵盤上壞了幾個(gè)鍵胁赢,于是在敲一段文字的時(shí)候企蹭,對應(yīng)的字符就不會(huì)出現(xiàn)。現(xiàn)在給出應(yīng)該輸入的一段文字智末、以及壞掉的那些鍵谅摄,打出的結(jié)果文字會(huì)是怎樣?
輸入格式:
輸入在 2 行中分別給出壞掉的那些鍵吹害、以及應(yīng)該輸入的文字螟凭。其中對應(yīng)英文字母的壞鍵以大寫給出;每段文字是不超過 個(gè)字符的串它呀。可用的字符包括字母
[a
-z
, A
-Z
]棒厘、數(shù)字 0
-9
纵穿、以及下劃線 _
(代表空格)、,
奢人、.
谓媒、-
、+
(代表上檔鍵)何乎。題目保證第 2
行輸入的文字串非空句惯。
注意:如果上檔鍵壞掉了,那么大寫的英文字母無法被打出支救。
輸出格式:
在一行中輸出能夠被打出的結(jié)果文字抢野。如果沒有一個(gè)字符能被打出,則輸出空行各墨。
輸入樣例:
7+IE.
7_This_is_a_test.
輸出樣例:
_hs_s_a_tst
思路
這道就是1029題的逆向版指孤,然后復(fù)雜了點(diǎn)而已。(但是代碼更少了是什么鬼)
- 讀缺岫隆:在記錄壞鍵的時(shí)候很多種鍵恃轩,但是都是ASCII字符,因此用一個(gè)int[128]數(shù)組記錄就好了黎做,一視同仁叉跛,簡單粗暴。
- 輸出:第二行是不會(huì)有'+'符號(hào)的蒸殿,因此除了大寫字母要特殊判斷筷厘,只要這個(gè)鍵沒有壞(數(shù)組沒有記錄)挽铁,不管是哪一類符號(hào),輸出就行了敞掘。
- 使用邊讀取邊處理的方式叽掘,空間占用降到最低。
-
toupper
函數(shù)對非字母字符會(huì)返回參數(shù)本身玖雁,因此記錄/查找的時(shí)候不必區(qū)分字符類型更扁,全都轉(zhuǎn)換成大寫。
這種方法比有多少種字符就創(chuàng)建多大的數(shù)組去記錄要方便的多赫冬,代碼量極少浓镜。
注意:第一行可能為空,使用scanf這樣跳過空白字符的函數(shù)就不行了劲厌。我一開始就用的逐字符讀取的方法膛薛,每次讀到換行,一直都沒有發(fā)覺這一點(diǎn)……
代碼
最新代碼@github补鼻,歡迎交流
#include <stdio.h>
#include <ctype.h>
int main()
{
char c;
int bad[128] = {0}; /* record keys are broken or not */
while((c = getchar()) != '\n') /* read broken keys */
bad[toupper(c)] = 1;
while((c = getchar()) != '\n') /* read string and print */
if(!bad[toupper(c)] && !(isupper(c) && bad['+']))
putchar(c);
return 0;
}