c++ - 使用 ASCII 的凯撒密码返回 C-cedilla

标签 c++ arrays encryption ascii caesar-cipher

所以我目前正在使用字母表的 ASCII 代码编写凯撒密码程序,其中原始文本将向右移动 6 个字符,但问题是当我输入字母 z 时,它返回 Ç 而不是返回字母F。到目前为止,这是我的代码:

void strEncrypt(string userin)
{
    char wordArray[userin.length()];
    strcpy(wordArray, userin.c_str());

    for (int i=0; i<userin.size(); i++)
    {
        if(wordArray[i]>=65 && wordArray[i]<91)
        {
            wordArray[i] = wordArray[i] + 6;
            if (wordArray[i]>90)
            {
                wordArray[i] = wordArray[i]-26;
            }
        }
        else if(wordArray[i]>=97 && wordArray[i]<123)
        {
            wordArray[i] = wordArray[i] + 6;
            while(wordArray[i]>=123)
            {
                wordArray[i] = wordArray[i]-26;
            }
        }
    cout << wordArray[i];
    }
}

尝试编译并运行它,以便您更清楚地了解我的问题所在

最佳答案

您正遭受有符号整数溢出的困扰!

其中很多是依赖于实现/未定义的行为,但抛开这些我将解释发生了什么。

您的 char 类型已签名,并保存从 -128127 的值。 'z' 的值为 122。当您添加 6 时,它变为 128... 如果它能够表示该数字。但是,最大值为 127,它会溢出。它环绕并变为 -128

您可以在添加之前进行检查,以确保该字符的值足够低,您可以安全地增加它来避免此问题。


具体来说,char是signed还是unsigned取决于实现,signed char只需要保存从-127127, signed overflow 是未定义的行为。

关于c++ - 使用 ASCII 的凯撒密码返回 C-cedilla,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35954446/

相关文章:

c++ - "filter"C++ 中的高阶函数

c - C 中各种字符串初始化的大小差异

encoding - 解密编码 : Packet Analysis Tools

linux - 如何从 bash 脚本加密 zip 文件

c++ - 如何返回可变数量的各种类型的容器?

c++ - 使用 long 的一般规则

php多维数组按类型和日期分组出现次数

c# - 如何加密一串文本,即使值相同,每次加密的字符串都不同

c++ - 如何在 C++ 中编写一组易于扩展的颜色类

c# - 确保顺序堆叠的 3 不会出现在随机排列的 4 数组中?