马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <string.h>
int main()
{
int i=0,shift;
char ch,message[50] = {0};
while ((ch = getchar()) != '\n')
{
message[i] = ch;
i++;
}
scanf("%d", &shift);
for(i = 0; i < strlen(message); i++)
{
if(message[i] >= 'a' && message[i] <= 'z')
{
if ((message[i] - 'a' + shift) >= 0)
message[i] = (message[i] - 'a' + shift) % 26 + 'a';
if ((message[i] - 'a' + shift) < 0)
message[i] = (message[i] - 'a' + shift+1) % 26 + 'z';
}
else if(message[i] >= 'A' && message[i] <= 'Z')
{
if ((message[i] - 'a' + shift) >= 0)
message[i] = (message[i] - 'A' + shift) % 26 + 'A';
if ((message[i] - 'a' + shift) < 0)
message[i] = (message[i] - 'A' + shift+1) % 26 + 'Z';
}
}
printf("%s",message);
return 0;
}
问题分析:这段代码是一个简单的凯撒密码加密程序,但是在加密过程中,当shift为负数时会出现错误。
问题解决:在代码中,当shift为负数时,需要对字母的ASCII码进行合适的处理,使其能够循环地从z或Z开始向前移动。
以下是修改后的代码:
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0, shift;
char ch, message[50] = {0};
while ((ch = getchar()) != '\n')
{
message[ i] = ch;
i++;
}
scanf("%d", &shift);
for(i = 0; i < strlen(message); i++)
{
if(message[ i] >= 'a' && message[ i] <= 'z')
{
if ((message[ i] - 'a' + shift) >= 0)
message[ i] = (message[ i] - 'a' + shift) % 26 + 'a';
else
message[ i] = (message[ i] - 'a' + shift + 26) % 26 + 'a';
}
else if(message[ i] >= 'A' && message[ i] <= 'Z')
{
if ((message[ i] - 'A' + shift) >= 0)
message[ i] = (message[ i] - 'A' + shift) % 26 + 'A';
else
message[ i] = (message[ i] - 'A' + shift + 26) % 26 + 'A';
}
}
printf("%s",message);
return 0;
}
在修改后的代码中,当shift为负数时,我们使用了 (message[ i] - 'a' + shift + 26) % 26 和 (message[ i] - 'A' + shift + 26) % 26 来实现循环移动。
这样修改后的代码就可以正确处理shift为负数的情况,实现了凯撒密码的加密功能。
|