C 中的 Caesar Cypher 给出不正确的输出

Caesar Cypher in C giving incorrect output

尝试在 C 中创建 Caesar Cypher 并在移动字母时从超过 'z' 的小写字母中获得一些麻烦的输出

#include <stdio.h>

void confab(const char* inText, int shift, char* outText) 
{
    int i = 0;
    int j = 0;
    char character = '[=10=]';
    while (inText[i] != '[=10=]') {
        if (inText[i] >= 'A' && inText[i] <= 'Z') {
            character = inText[i] + shift;
            if (character > 'Z') {
                character = character - 'Z' + 'A' - 1;
            }
            outText[j] = character;
            j += 1;
        } else if (inText[i] >= 'a' && inText[i] <= 'z') {
            character = inText[i] + shift;
            if (character > 'z') {
                character = (character - 'z' + 'a' - 1);
            }
            outText[j] = character;
            j += 1;
        } else {
            outText[j] = inText[i];
            j += 1;
        }
        i += 1;
    }
}


int main(void)
{
    char buffer[60] = {0};
    char* s = "The quick brown fox jumps over the lazy dog.";
    confab(s, 13, buffer);
    printf("%s\n", buffer);
}

正在给出输出:

Gur d2vpx oeb4a sb5 w2zc0 b3re 1ur yn76 qbt.

而不是:

Gur dhvpx oebja sbk whzcf bire gur ynml qbt.

怀疑我的 ASCII 算法在小写字母的 if 语句中不正确。

您的代码存在的问题是 character 变量被声明为带符号的 1 字节数字。

所以通过查看ASCII tablea-z在97-122的范围内。问题是当你尝试移动超过 5 个时,它会 溢出 因为 带符号的 1 字节数不能超过 127.

因此,将 char character = '[=12=]'; 更改为 unsigned char character = '[=13=]'; 即可。

你可以在这里参考任何字节的最大整数个数 - https://en.wikipedia.org/wiki/Integer_(computer_science)#Common_integral_data_types