回顾知识点:
- memset(a, -1, sizeof(a)); 头文件为
#include<cstring>
memset 一般只用来赋值0或者-1 - c = getchar(); 输入一个字符
scanf("%s", str); 输入一个字符串,遇到空格或换行符结束
gets(str); 输入一个字符串,遇到换行符结束 - int len = strlen(str); 返回字符串的长度,有几个字符就返回几 “abc”返回3
int cmp = strcmp(str1, str2); 字符串比较(字典序比较,a<b),返回负整数、0、正整数
strcpy(str1, str2); 2复制给1
strcpy(str1, str2); 2拼接到1后面
这里有一道题,字符串破译:http://pipioj.online/problem.php?id=1007
题目描述
- 据说最早的密码来自于罗马的凯撒大帝。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A 都分别替换成字母F)。而你要获得消息原文,也就是要将这个过程反过来。
密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
(注意: 只有字母会发生替换,其他非字母的字符不变,并且消息原文的所有字母都是大写的。)
输入
- 最多不超过 100 个数据集组成,每个数据集之间不会有空行,每个数据集由 3 部分组成:
起始行: START
密码消息:由 1 到 200 个字符组成一行,表示凯撒发出的一条消息.
结束行: END
在最后一个数据集之后,是另一行:ENDOFINPUT。
输出
- 每个数据集对应一行,是凯撒的原始消息。
样例输入
- START
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
END
START
N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
END
START
IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
END
ENDOFINPUT
样例输出
- IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE
分析:
- 题目不难但是有时间要求,一个点在字符串输入,如果用自己判断输入,会超时;还有一个在字符替换上,如何写的优雅简洁
源码如下:
#include <cstdio>
#include <cstring>
void slove(char *str) {
int len = strlen(str);
for(int i = 0; i < len; i++) {
if(str[i] >= 'A' && str[i] <= 'Z') {
switch(str[i]) {
// abcdefg higklmn opqrst uvwxyz
case 'A': str[i] = 'V'; break;
case 'B': str[i] = 'W'; break;
case 'C': str[i] = 'X'; break;
case 'D': str[i] = 'Y'; break;
case 'E': str[i] = 'Z'; break;
default: str[i] -= 5;
}
}
}
printf("%s\n", str);
}
int main() {
char str[201];
while(true) {
gets(str); // 输入的第一行字符
if (str[0] == 'E')
break;
gets(str); // 输入的第二行字符
slove(str);
gets(str); // 输入的第三行字符
}
// printf("okok\n");
return 0;
}