例题3-2 WERTYU(WERTYU, UVa10082)
把手放在键盘上时,稍不注意就会往右错一
位。这样,输入Q会变成输入W,输入J会变成输
入K等。键盘如图3-2所示。
输入一个错位后敲出的字符串(所有字母均
图3-2 键盘
大写),输出打字员本来想打出的句子。输入保
证合法,即一定是错位之后的字符串。例如输入中不会出现大写字母A。
样例输入:
O S, GOMR YPFSU/
image.png
样例输出:
I AM FINE TODAY.
#include<stdio.h>
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main() {
int i, c;
while((c = getchar()) != EOF) {
for (i=1; s[i] && s[i]!=c; i++); //找错位之后的字符在常量表中的位置
if (s[i]) putchar(s[i-1]); //如果找到,则输出它的前一个字符
else putchar(c);
}
return 0;
}
这里要注意的是,不能用scanf("%c",&c)而是getchar()
scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。
什么鬼
getchar:从stdio流中读字符,相当于getc(stdin),它从标准输入里读取下一个字符。返回类型为int型,返回值为用户输入的ASCⅡ码,出错返回-1。
还有的就是,用字符串往往比较简洁
#include <iostream>
#include <cstring>
using namespace std;
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main() {
int c;
while((c = getchar())!=EOF){
char *strtem;
int ok =1;
if((strtem=strchr(s,c))==NULL) ok =0;
if(ok)
cout << *(--strtem);
else printf("%c",c); // 这里包含了一个强制的转换.
}
return 0;
}
常量数组往往会能简化代码,数组无需指明长度,编译器计算.
网友评论