C\C++ 知识回顾,memset及字符字符串相关操作,破译密码

回顾知识点:

  • 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;
}
发布了107 篇原创文章 · 获赞 61 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/104602388