2141 Message Decowding

2141 Message Decowding


問題は超簡単。
26文字の新しいアルファベットを定義して、それに基づいて入力された文字列を
デコードするというもの。
ただちょっと詰まったところがあったので備忘録。


詰まったコード。

#include<cstdio>
#include<ctype.h>

using namespace std;

int main() {
    char key[27];
    scanf("%s", key);
    char c;
    while ((c = getchar()) != '\n') {
	if (c == ' ') printf(" ");
	else if (isupper(c)) {
	    printf("%c", toupper(key[c-'A']));
	} else {
	    printf("%c", key[c-'a']);
	}
    }
    printf("\n");
}

これを実行すると、まず最初のscanfで新しいアルファベットを
定義するのだけれど、改行の'\n'はkeyに読み込まれないので、
改行時に叩いたEnter分の'\n'はwhileに書いたgetchar()で読み込まれる。
当然こんな動きは意図していないので、バグってしまうというわけだった。


これに対処するには、scanfのあとにgetchar()を入れてEnterを叩いて入力された'\n'を読み飛ばしてやる必要がある。


これで通ったけど、こんな解釈でいいのだろうか。。。