zyh1104 发表于 2023-11-9 09:16:27

报错

#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;
}

isdkz 发表于 2023-11-9 09:17:13

问题分析:这段代码是一个简单的凯撒密码加密程序,但是在加密过程中,当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]
查看完整版本: 报错