报错
#include <stdio.h>#include <string.h>
int main()
{
int i=0,shift;
char ch,message = {0};
while ((ch = getchar()) != '\n')
{
message = ch;
i++;
}
scanf("%d", &shift);
for(i = 0; i < strlen(message); i++)
{
if(message >= 'a' && message <= 'z')
{
if ((message - 'a' + shift) >= 0)
message = (message - 'a' + shift) % 26 + 'a';
if ((message - 'a' + shift) < 0)
message = (message - 'a' + shift+1) % 26 + 'z';
}
else if(message >= 'A' && message <= 'Z')
{
if ((message - 'a' + shift) >= 0)
message = (message - 'A' + shift) % 26 + 'A';
if ((message - 'a' + shift) < 0)
message = (message - '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 = {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为负数的情况,实现了凯撒密码的加密功能。
页:
[1]