67,633
社区成员
发帖
与我相关
我的任务
分享把手放在键盘上,稍不注意就会往右错一位。这样,输入Q会变成输入W,输入J会变成输入K等。键盘如图所示。 输入一个错位后敲出来的字符串(所有字母均大写),输出打字员本来想打出的矩阵输入保证合法,即一定是错位之后的字符串。例如输入中不会出现大写字母A。
多行输入 每行包括数字,空格,大写字母(除了Q,A,Z)或者是标点符号(除了“'”(L右面第2个)),标有单词的按键,如Tab,BackSp,Control等等不会出现
你需要用每个字母或者符号左面的(在如图给出的QWERTY类型的键盘)那个按键内容替换他,输入的空格不作处理,依然输出空格
输入 #1
O S, GOMR YPFSU/
输出 #1
I AM FINE TODAY.
类似[UVA401回文词](UVA401 回文词 Palindromes 题解-CSDN社区),都是建立一个映射关系,这个题和回文词不同的是,这个题涉及到大量符号,没有明显规律(代码会很复杂),所以我们可以用遍历的方法,建立一个按照键盘顺序的字符串,每个字符都遍历查找一遍,输出这个字符的前一个字符
#include <stdio.h>
int main() {
// 注意:'\'需要转义
char str[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
char c;
int i;
while ((c = fgetc(stdin)) != EOF) {
// ' '和'\n'需要原样输出
if (c == ' ') {
printf(" ");
continue;
}
if (c == '\n') {
printf("\n");
continue;
}
// 查找
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == c) {
printf("%c",str[i-1]);
break;
}
}
}
return 0;
}
参考紫书答案
#include <stdio.h>
int main() {
char str[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
char c;
int i;
while ((c = fgetc(stdin)) != EOF) {
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == c) {
printf("%c",str[i-1]);
break;
}
}
// 没有找到字符,其实就是空格和回车
if (str[i] == '\0') {
printf("%c", c);
}
}
return 0;
}