描述
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词属于字母表的下面,如下所示:
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
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。
请实现下述接口,通过指定的密匙和明文得到密文。
本题有多组输入数据。
输入描述:
先输入key和要加密的字符串
输出描述:
返回加密后的字符串
示例1
输入:
nihao
ni
复制
输出:
le
#include <stdio.h>
#include <string.h>
int main(void)
{
// 一开始key的size取得不够大,导致运行错误
char key[64] = {0};
char map[27] = {0};
char str[100] = {0};
int i, j;
char p;
while(scanf("%s", key) != EOF)
{
scanf("%s", str);
j = 0;
for(i=0; i<strlen(key); i++)
{
if(key[i]>='a' && key[i]<='z')
{
key[i] = key[i]-'a'+'A';
}
}
for(i=0; i<strlen(key); i++)
{
if(i == 0)
{
map[j] = key[i];
j++;
}
else
{
if(!strchr(map, key[i]))
{
map[j] = key[i];
j++;
}
}
}
for(p='A'; p<='Z'; p++)
{
if(!strchr(map, p))
{
map[j] = p;
j++;
}
}
//printf("%s\n", map);
for(i=0; i<strlen(str); i++)
{
if(str[i]>='a' && str[i]<='z')
{
printf("%c", map[str[i]-'a']-'A'+'a');
}
else if(str[i]>='A' && str[i]<='Z')
{
printf("%c", map[str[i]-'a']);
}
else
{
printf("%c", str[i]);
}
}
printf("\n");
memset(map, 0, sizeof(map));
memset(key, 0, sizeof(key));
memset(str, 0, sizeof(str));
}
return 0;
}
5329

被折叠的 条评论
为什么被折叠?



