题目描述
由键盘任意输入一串字符,对其进行加密,加密原则为:如果为字母,将其循环右移2个字母,其他字符保持不变。
输入
一串字符
输出
加密后的字符串
样例输入
ab12CDxyz
样例输出
cd12EFzab
题目分析:
对这串字符串作个遍历,遇到大小写字母了,开始作处理:
%取余操作常用于字符的循环,例如假设a字符的ascii码值是32,想要前33个字符构成一个循环,a向右移动两个位置,要求还在循环里,这时候a的下标就要变成(a+2)%33=1 (循环中下标从0开始)
1.先把字符的值转化成0-25之间的数值,方便进行取余操作
对应代码:‘c-'a' (c-'A') c表示字符变量,注意啊,以下的操作都是在减去‘a’的ascii码值的基础上操作,并不代表真正的ascii码值!!!
2.然后进行加2操作,向右移动两位,以y这个字符为例:
假设c-'a'=24对应的字符为y
除了末尾的几个字符出现这种情况外,而其它字符都不会出现这种情况,比如23再进行如下操作还是23.
3.c-'a'+2后变成了26,显然不在我们的循环中,所以进行取余(c-'a'+2)%26,结果为0,就对应这0位置的字符的下标,就是字符a,但是我们知道0显然不是a的ASCII码值,需要再加上‘a’,用来归位。
代码实现:
#include<stdio.h>
#include<string.h>
int main()
{
char a[10000];
gets(a);
//scanf("%s",a);
for(int i=0;i<strlen(a);i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
a[i]=(a[i]+2-'A')%26+'A';
}
else if(a[i]>='a'&&a[i]<='z')
{
a[i]=(a[i]+2-'a')%26+'a';
}
else
continue;
}
puts(a);
return 0;
}
在循环中,break语句用于结束循环,continue表示跳过本次循环,还可以执行下一次循环。
值得注意的是,当我们使用puts语句时,我们会发现,多一个空行,puts会在字符串后加一个\n进行输出。
运行结果:
欢迎批评指正!!!