c - 凯撒密码加密中如何从 'z'返回到 'a'

标签 c

我正在尝试使用 C 中的凯瑟密码加密消息,当我在消息中找到字符“z”时,我试图返回字符“a”(通过 -=25 ),但它不会返回对于字符“a”,它会返回到字符“b”,我也尝试过 -=26 和 -=24,但没有到达“a”,任何评论都将受到高度赞赏。这是我的代码............

void casear_cipher(char *message);
int main()
{
    char message[] = "Todayzzz is Tuesday";
    printf("Original Message is : '%s'\n", message);

    casear_cipher(message);

    printf("Encrypted Message is: '%s'\n", message);
}

void casear_cipher(char *message)
{
    int i;
    int message_length = strlen(message);
    for(i = 0; i<message_length; i++)
    {
        if(message[i] == 'z' || message[i] == 'Z')
        {
            message[i] -= 25; //<-------------------------Problem is here
        }

        if( (message[i] >= 'a' && message[i] <= 'z') || (message[i] >= 'A' && message[i] <= 'Z') )
        {
            message[i] += KEY;
        }
    }
}

最佳答案

您不会得到“a”,因为您的第二个 if 仍在运行。第一个 if 将值更改为 A 或 a,第二个 if 添加 KEY 值。如果您希望所有 z 变为 a,Z 变为 A,您需要将其更改为 else if,如下所示:

if(message[i] == 'z' || message[i] == 'Z')
{
    message[i] -= 25; 
}

else if( (message[i] >= 'a' && message[i] <= 'z') || (message[i] >= 'A' && message[i] <= 'Z') )
{
    message[i] += KEY;
}

我认为你想要更多类似这样的东西:

if((message[i] >= ('z' - KEY + 1) && message[i] <= 'z') || (message[i] > (('Z' - KEY + 1)) && message[i] < 'Z'))
{
    message[i] -= 26;
    message[i] += KEY;
}

else if((message[i] >= 'a' && message[i] <= 'u') || (message[i] >= 'A' && message[i] <= 'U'))
{
    message[i] += KEY;
}

这样,每当任何值超过 Z 或 z 时,它都会从字母表的开头开始。

关于c - 凯撒密码加密中如何从 'z'返回到 'a',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39979289/

相关文章:

c - 卸载到 MIC (Xeon Phi) 时迭代加载的阵列时出错

android - 为跨平台 OpenGL ES 2.0+ 引擎选择语言和设计 - iOS 和 Android

CS50 PSet 2 : Vigenere cipher Segmentation Fault

c - 二维字符数组

c - 生成一个 secret 数字并用 C 猜测它

比较两个 passwd 结构

C + 图形用户界面 + Mac 操作系统

c - 我对一些概念和代码有疑问

c - 升级到 Windows 10 后不再具有通过 gcc 编译的权限

c - 在 if 语句/管理进程中使用 fork