为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个负整数offset,用凯撒密码将其加密后输出。凯撒密码是一种简单的替换加密技术,当偏移量是负数时,将明文中的所有字母都在字母表上向前偏移offset位后被替换成密文。
例如,当偏移量offset是-2时,表示所有的字母被向前移动 2 位后的字母替换,即所有的字母 Z 将被替换成X,字母 Y 将变为 W,…,字母 C 变成 A,字母 B 则变为 Z,字母 A 变为 Y。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个负整数offset。
输出格式:
输出加密后的结果字符串。
如果输入的offset不在有效范围内,则在一行出"Invalid."。
输入样例1:
Hello Hangzhou
-2
输出样例1:
Fcjjm Fylexfms
输入样例2:
在这里给出一组输入。例如:
z=x+y
1
输出样例2:
Invalid.
思路:遍历字符数组的每一个元素,输出按规则对应的字符。
易错点:①“a”前移两位后输出应为‘y’
#include<stdio.h>
int main()
{
char a [81];
int offset;
int n;
gets(a);
if(scanf("-%d",&n))//读入需要前移的位数。
// 注意:如果读入的数据格式为"-%d",即读入了一个负整数,scanf函数返回1,条件为真,执行if
//如果读入的数据格式与"-%d"不符,scanf函数返回0,条件为假,执行else
{
offset=n%26;//当n取值大于26时,说明前移进入下一个周期,则前移n%26位数
int i;
for(i=0;a[i]!='\0';i++)//遍历字符数组内的每一个有效元素 ,并进行修正输出
{
if(a[i]>='a'&&a[i]<='z')//小写
{
if(a[i]-offset<'a')//先判断前移后出现越界的情况
{
printf("%c",a[i]-offset+26);
}
else //前移后不越界的情况
{
printf("%c",a[i]-offset);
}
}
else if(a[i]>='A'&&a[i]<='Z')//大写
{
if(a[i]-offset<'A')
{
printf("%c",a[i]-offset+26);//先判断前移后出现越界的情况
}
else
{
printf("%c",a[i]-offset); //前移后不越界的情况
}
}
else//如果该元素不是字母,则不需要迁移,原样输出
{
printf("%c",a[i]);
}
}
}
else
{
printf("Invalid.\n");
}
return 0;
}