/*
把手放在键盘上时,稍不注意就会往右错移一位。这样的话,Q会变成W,
J会变成K等。电脑键盘如下图所示:
` 1234567890-=BackSP
TabQWERTYIOP[]\
A SDFGHJKL;'Enter
Z XCVBNM,./
Control Alt Alt Control
输入一个错位后敲出的字符串,输出打字员本来想打出的句子。
输入:O S,GOMR YPSFU
输出:I AM FINE TODAY.
思路:
设置一个int 数组映射
char iArr[(int)'W'] = 'Q';
char iArr[(int)'1'] = '`';
这个太烦,将两个字符串放在一起,采用一前一后对称方式:
还原的字符串:`1234567890-QWERTYUIOP[]ASDFGHJKL;ZXCVBNM,.
敲错的字符串:1234567890-=WERTYUIOP[]\SDFGHJKL;'XCVBNM,./
*/
/*
关键:
1 在输入 O S,GOMR YPSFU时,因为空格,scanf会当成多个字符串,这里可以采用gets来做,gets默认不会以空格来切分字符串
2 此题除了设置两个一一对应数组外,还可以采用前移一位来打印字符串。while((ch = getchar()) != EOF) putchar(priStr[i-1]);
3 注意,转移字符'\'需要用 '\\'表示
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1024
char* findCorStr(char* str,char* rStr)
{
char priStr[MAXSIZE] = " 1234567890-=WERTYUIOP[]SDFGHJKL;'XCVBNM,./\\";
char resStr[MAXSIZE] = " `1234567890-QWERTYUIOP[ASDFGHJKL;ZXCVBNM,.]";
int iLen = strlen(priStr);
int iStrLen = strlen(str);
int i,j;
for(i = 0 ; str[i] != '\0'; i++)
//for(i = 0 ; i < iStrLen ; i++)
{
for(j = 0; j <= iLen ; j++)
{
if(str[i] == priStr[j])
{
rStr[i] = resStr[j];
break;
}
}
}
rStr[i] = '\0';
return rStr;
}
void priStr(char* str)
{
char priStr[MAXSIZE] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
char ch;
while((ch = getchar()) != EOF)
{
for(int j = 0 ; str[j] != '\0' ;j++)
{
for(int i = 1 ; priStr[i] != '\0' ; i++)
{
if(str[j] == priStr[i])
{
putchar(priStr[i-1]);
break;
}
}
}
}
}
int main(int argc,char* argv[])
{
char rStr[MAXSIZE];
char str[MAXSIZE];
gets(str);
printf("%s\n",findCorStr(str,rStr));
/*
while(EOF != scanf("%s",str));//关键:若输入空格,则会当成若干个字符串进行切割
{
char rStr[MAXSIZE];
printf("%s\n",findCorStr(str,rStr));
}
*/
system("pause");
return 0;
}
算法竞赛入门经典:第五章 基础题目选解 5.1WERTYU
最新推荐文章于 2022-03-06 01:00:00 发布