为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
输入样例1:
Hello Hangzhou
2
输出样例1:
Jgnnq Jcpibjqw
输入样例2:
a=x+y
-1
输出样例2:
z=w+x
# include<stdio.h>
# include<math.h>
# define MAXN 80 /* 定义符号常量MAXN */
# define M 26 /* 定义符号常量M,表示字母表中大写或者小写字母的数量26 */
int main(void)
{
int i, offset;
char str[MAXN];
/* 输入字符串 */
i = 0;
while((str[i] = getchar( )) != '\n'){
i++;
}
str[i] = '\0'; /* 将结束符 '\0' 存入数组 */
scanf("%d", &offset);
if(abs(offset) >= M){ /* 如果offset超过26 *///如不加绝对值负26的倍数会出问题
offset = offset % M; /* 移位效果相当于取其余数 */
}
/* 加密 */
if(offset!=0){ //26倍数就不加密
for(i = 0; str[i] != '\0'; i++){ /* 循环条件:str[i] 不等于 '\0' */
if(str[i] >= 'A' && str[i] <= 'Z'){
if((str[i] - 'A' + offset)>0)
if((str[i] - 'A' + offset)<M) {
str[i] = str[i] + offset;
}else{ /* 如果向后越界 */
str[i] = str[i] - (M - offset); /* 循环移位 */
}
else //offset<0时
{str[i] = str[i] + M+offset;}
}else if(str[i] >= 'a' && str[i] <= 'z'){
if((str[i] - 'a' + offset)>0)
if((str[i] - 'a' + offset)<M) {
str[i] = str[i] + offset;
}else{ /* 如果向后越界 */
str[i] = str[i] - (M - offset); /* 循环移位 */
}
else //offset<0时
{str[i] = str[i] + M+offset;}
}
}
}
/* 输出密文字符串 */
for(i = 0; str[i] != '\0'; i++){ /* 循环条件:str[i] 不等于 '\0' */
putchar(str[i]);
}
return 0;
}