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:
The QWERTY Layout |
---|
|
The Dvorak Layout |
---|
|
A QWERTY document Edward typed. The document has no more than 100 kibibytes. And there are no invalid characters in the document.
The Dvorak document.
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
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;
}