在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。
格式
输入格式
输入一行,包含一个字符串,长度小于80个字符。
输出格式
输出每行字符串的加密字符串。
样例
输入样例
Hello! How are you!
输出样例
Ifmmp! Ipx bsf zpv!
限制
时间限制:1000 ms
内存限制:65536 KB
提示
由于windows和linux下面的换行符不同,所以读入一行字符推荐使用fgets或者gets函数;尽量避免使用getchar读入,后者需要自行解决跨平台问题。
然后以下是我写的,我找不到哪里错了,但是我的作业提交系统中只给了80分。球球各位带佬辣!!!
#include<stdio.h> #
include<string.h>
int main()
{
char a[1000];
gets(a);
int i=0;
int len=strlen(a);
for(i=0;i<=len-1;i++)
{
if((a[i]<'A')||('Z'<a[i]&&a[i]<'a')||(a[i]>'z'))
a[i]=a[i]+0;
else a[i]=a[i]+1;
printf("%c",a[i]);
}
return 0;
}
又几个方面可以改进:
1) 用下表访问需要计算地址,比用指针慢。
2)用指针就可以不需要for循环而用while,就可以省去for循环里的变量i的计算。
3)不用求strlen,而用字符串结尾è'\0'结束循环。
4)一个一个字符输出,每个字符调用一次函数,太慢。加密完后争锋字符串输出就好了。
#include<stdio.h>
int main()
{
char a[1000];
printf("Please enter original string (letters only, lower case or upper case):\n");
gets(a);
char *p = a;
while (*p)
{
if (*p == 'z' || *p == 'Z')
*p -= 25;
else if (*p >= 'a' && *p < 'z' || *p >= 'A' && *p < 'Z')
++*p;
++p;
}
printf("Encrypted string:\n%s\n", a);
return 0;
}
// Output
Please enter original string (letters only, lower case or upper case):
Hello! How are you!
Encrypted string:
Ifmmp! Ipx bsf zpv!
附注:求赞助积分和C币。加入CSDN将近20年了。最近几年忙小孩没登录。刚才搜索到一本电子书想下载,需要20积分/C币。已经收到8元了,还差12元。赞助多少都可以。多谢。
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000] = { 0 };
gets_s(a, _countof(a));
for (int i = 0; i < strlen(a); i++)
{
if (((a[i] >= 'A') && (a[i] < 'Z')) || ((a[i] >= 'a') && (a[i] < 'z')))
{
a[i] += 1;
}
else if (('z' == a[i]) || ('Z' == a[i]))
{
a[i] -= ('z' - 'a');
}
}
printf("%s\n", a);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y