ZOJ 3878 Convert QWERTY to Dvorak 字符串输入 水题

Edward, a poor copy typist, is a user of the Dvorak Layout. But now he has only a QWERTY Keyboard with a broken Caps Lock key, so Edward never presses the broken Caps Lock key. Luckily, all the other keys on the QWERTY keyboard work well. Every day, he has a lot of documents to type. Thus he needs a converter to translate QWERTY into Dvorak. Can you help him?

The QWERTY Layout and the Dvorak Layout are in the following:

Qwerty Layout
The QWERTY Layout

Dvorak Layout
The Dvorak Layout


Input

A QWERTY document Edward typed. The document has no more than 100 kibibytes. And there are no invalid characters in the document.

Output

The Dvorak document.

Sample Input
Jgw Gqm Andpw a H.soav Patsfk f;doe
Nfk Gq.d slpt a X,dokt vdtnsaohe
Kjd yspps,glu pgld; aod yso kd;kgluZ
1234567890
`~!@#$%^&*()}"']_+-=ZQqWEwe{[\|
ANIHDYf.,bt/
ABCDEFuvwxyz
Sample Output
Hi, I'm Abel, a Dvorak Layout user.
But I've only a Qwerty keyboard.
The following lines are for testing:
1234567890
`~!@#$%^&*()+_-={}[]:"'<>,.?/\|
ABCDEFuvwxyz
AXJE>Ugk,qf;


    这道题其实没什么好说的,一道水题,两个键盘,一个输入一个输出,问给一段字符串正确的输出应该是什么。写这个的原因是因为这道题出现了一个之前从没见过的错误,Segmentation Fault。所以看见的时候一脸懵逼......先贴上错误的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1005];

int change(char a)
{
    switch(a)
    {
        case '-':cout<<"[";break;
        case '_':cout<<"{";break;
        case '=':cout<<"]";break;
        case '+':cout<<"}";break;

        case 'q':cout<<"'";break;
        case 'Q':cout<<"\"";break;
        case 'w':cout<<",";break;
        case 'W':cout<<"<";break;
        case 'e':cout<<".";break;
        case 'E':cout<<">";break;
        case 'r':cout<<"p";break;
        case 'R':cout<<"P";break;
        case 't':cout<<"y";break;
        case 'T':cout<<"Y";break;
        case 'y':cout<<"f";break;
        case 'Y':cout<<"F";break;
        case 'u':cout<<"g";break;
        case 'U':cout<<"G";break;
        case 'i':cout<<"c";break;
        case 'I':cout<<"C";break;
        case 'o':cout<<"r";break;
        case 'O':cout<<"R";break;
        case 'p':cout<<"l";break;
        case 'P':cout<<"L";break;
        case '{':cout<<"?";break;
        case '[':cout<<"/";break;
        case '}':cout<<"+";break;
        case ']':cout<<"=";break;

        case 'a':cout<<"a";break;
        case 'A':cout<<"A";break;
        case 's':cout<<"o";break;
        case 'S':cout<<"O";break;
        case 'd':cout<<"e";break;
        case 'D':cout<<"E";break;
        case 'f':cout<<"u";break;
        case 'F':cout<<"U";break;
        case 'g':cout<<"i";break;
        case 'G':cout<<"I";break;
        case 'h':cout<<"d";break;
        case 'H':cout<<"D";break;
        case 'j':cout<<"h";break;
        case 'J':cout<<"H";break;
        case 'k':cout<<"t";break;
        case 'K':cout<<"T";break;
        case 'l':cout<<"n";break;
        case 'L':cout<<"N";break;
        case ';':cout<<"s";break;
        case ':':cout<<"S";break;
        case '\'':cout<<"-";break;
        case '"':cout<<"_";break;

        case 'z':cout<<";";break;
        case 'Z':cout<<":";break;
        case 'x':cout<<"q";break;
        case 'X':cout<<"Q";break;
        case 'c':cout<<"j";break;
        case 'C':cout<<"J";break;
        case 'v':cout<<"k";break;
        case 'V':cout<<"K";break;
        case 'b':cout<<"x";break;
        case 'B':cout<<"X";break;
        case 'n':cout<<"b";break;
        case 'N':cout<<"B";break;
        case 'm':cout<<"m";break;
        case 'M':cout<<"M";break;
        case ',':cout<<"w";break;
        case '<':cout<<"W";break;
        case '.':cout<<"v";break;
        case '>':cout<<"V";break;
        case '/':cout<<"z";break;
        case '?':cout<<"Z";break;

        default:cout<<a;break;
    }
    return 0;
}

int main()
{
    int i;
    int len;
    while(gets(s))
    {
        len=strlen(s);
        for(i=0;i<len;i++)
        {
            change(s[i]);
        }
        cout<<endl;
    }
    return 0;
}

    后来进行了各种百度,才找出了这个错误出现的原因,是因为在输入的时候使用了gets(),而gets()这种输入方法并不是完全安全的输入,所以导致了这个问题(话说我之前的字符串都用的gets()也没出过问题啊= =),修改了输入方式之后就AC了。

    下面是AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
string s;

void change(char a)
{
    switch(a)
    {
        case '-':cout<<"[";break;
        case '_':cout<<"{";break;
        case '=':cout<<"]";break;
        case '+':cout<<"}";break;
        case 'q':cout<<"'";break;
        case 'Q':cout<<"\"";break;
        case 'w':cout<<",";break;
        case 'W':cout<<"<";break;
        case 'e':cout<<".";break;
        case 'E':cout<<">";break;
        case 'r':cout<<"p";break;
        case 'R':cout<<"P";break;
        case 't':cout<<"y";break;
        case 'T':cout<<"Y";break;
        case 'y':cout<<"f";break;
        case 'Y':cout<<"F";break;
        case 'u':cout<<"g";break;
        case 'U':cout<<"G";break;
        case 'i':cout<<"c";break;
        case 'I':cout<<"C";break;
        case 'o':cout<<"r";break;
        case 'O':cout<<"R";break;
        case 'p':cout<<"l";break;
        case 'P':cout<<"L";break;
        case '{':cout<<"?";break;
        case '[':cout<<"/";break;
        case '}':cout<<"+";break;
        case ']':cout<<"=";break;
        case 'a':cout<<"a";break;
        case 'A':cout<<"A";break;
        case 's':cout<<"o";break;
        case 'S':cout<<"O";break;
        case 'd':cout<<"e";break;
        case 'D':cout<<"E";break;
        case 'f':cout<<"u";break;
        case 'F':cout<<"U";break;
        case 'g':cout<<"i";break;
        case 'G':cout<<"I";break;
        case 'h':cout<<"d";break;
        case 'H':cout<<"D";break;
        case 'j':cout<<"h";break;
        case 'J':cout<<"H";break;
        case 'k':cout<<"t";break;
        case 'K':cout<<"T";break;
        case 'l':cout<<"n";break;
        case 'L':cout<<"N";break;
        case ';':cout<<"s";break;
        case ':':cout<<"S";break;
        case '\'':cout<<"-";break;
        case '"':cout<<"_";break;
        case 'z':cout<<";";break;
        case 'Z':cout<<":";break;
        case 'x':cout<<"q";break;
        case 'X':cout<<"Q";break;
        case 'c':cout<<"j";break;
        case 'C':cout<<"J";break;
        case 'v':cout<<"k";break;
        case 'V':cout<<"K";break;
        case 'b':cout<<"x";break;
        case 'B':cout<<"X";break;
        case 'n':cout<<"b";break;
        case 'N':cout<<"B";break;
        case 'm':cout<<"m";break;
        case 'M':cout<<"M";break;
        case ',':cout<<"w";break;
        case '<':cout<<"W";break;
        case '.':cout<<"v";break;
        case '>':cout<<"V";break;
        case '/':cout<<"z";break;
        case '?':cout<<"Z";break;
        default:cout<<a;break;
    }
}

int main()
{
    int i;
    int len;
    while(getline(cin,s))
    {
        len=s.length();
        for(i=0;i<len;i++)
        {
            char c=s[i];
            change(c);
        }
        cout<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值