凯撒密码在 C 中不起作用

Caesar cipher won't work in C

我正在尝试创建一个凯撒密码,所以我声明了一个将每个字符压入 13 次的函数。然后是另一个函数,它接受一个字符串,然后对其进行加密或解密,我是用 f​​or 循环完成的。 但问题是,当我 运行 程序时,结果是这样的:

Original: This is the Original text
encrypted: QnÇ vÇü qre Bevtvanyüràü
decrypted: DaÇ âÇü der Orâüânaåüeàü

有没有人知道这是什么原因造成的?

#include <stdio.h>
#include <stdlib.h>

int shift = 13;

char shiftchar(char ch){
    if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
        ch = ch + shift;
        if(ch > 90 && ch < 104){
            ch = ch - 90 +64;
        }
        else if(ch > 122 && ch < 136){
            ch = ch -122 +96;
        }
    }
    else{
    ch = ch;
    }
}

void cipher (char str[]){

    for( int i = 0; str[i] != 0; ++i){
        str[i] = shiftchar(str[i]);
    }
}

int main(void){

    char str[25] = "This is the original text";

    printf("Original: ");
    printf("%s\n", str);

    cipher(str);
    printf("encrypted: ");
    printf("%s\n", str);

    cipher(str);
    printf("decrypted: ");
    printf("%s\n", str);
}

你好像忘了,一个char字符串真的叫做null-terminatedbyte stringnull-terminator 非常重要,因为这是所有标准函数都在寻找的字符串结束时间和位置。

您的数组 str 太小,无法容纳终结符。改为将其设为包含 26 个元素的数组。或者不明确指定大小,让编译器设置它。

您的代码有两个简单的错误。首先,char 类型的变量在内存中占用 8 bits,其值范围从 -128127。在某些情况下,您的加密字符最终可能会得到一个大于 127 的值,因此您需要使用 unsigned char 作为数据类型,其取值范围从 0255 相反。

因此,您的函数声明应如下所示:char shiftchar(unsigned char ch);

也不需要这行代码:ch = ch;而且您也没有return您的函数生成的加密字符。

最终函数应如下所示:

char shiftchar(unsigned char ch){
    if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
        ch = ch + shift;
        if(ch > 90 && ch < 104){
            ch = ch - 90 +64;
        }
        else if(ch > 122 && ch < 136){
            ch = ch -122 +96;
        }
    }
    return ch;
}

您的代码现在可以按预期运行,但要完美完成所有操作,我们需要修改字符数组的大小。您将 main 中数组 char str[] 的大小设置为 25.

永远不要忘记用于初始化数组的任何字符串文字末尾的不可见 NULL 终止符。

数组声明应该是:char str[26] = "This is the original text";,你也可以避免忘记[=26=]的头痛,你可以这样做:char str[] = "This is the original text";从而把工作留给编译器确定数组的大小 ;)

我测试了你的代码,除了 unsigned 问题,你还缺少 shiftchar 函数中的 return 语句。

char shiftchar(unsigned char ch){
    if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
        ch = ch + shift;
        if(ch > 90 && ch < 104){
            ch = ch - 90 +64;
        }
        else if(ch > 122 && ch < 136){
            ch = ch -122 +96;
        }
    }
    else{
    ch = ch;
    }
    return ch;
}