代码之家  ›  专栏  ›  技术社区  ›  Basil Hallaq

Caesar密码在C中不起作用

  •  1
  • Basil Hallaq  · 技术社区  · 7 年前

    我试图创建一个凯撒密码,所以我声明了一个函数,将每个字符推13次。然后是另一个函数,它接受一个字符串,然后对其进行加密或解密,我用for循环实现了这一点。 但问题是,当我运行程序时,结果是:

    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);
    }
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Ahmed Karaman    7 年前

    你的代码有两个简单的错误。首先,一个类型的变量 char 占用 8 bits 内存中具有值范围形式 -128 127 . 在某些情况下,加密字符的值可能最终大于 127 所以你需要使用 unsigned char 作为数据类型,取值范围为 0 255 相反

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

    也不需要这行代码: ch = ch; 你也没有从函数中返回结果的加密字符。

    最后一个函数应该如下所示:

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

    到目前为止,您的代码将按预期运行,但为了圆满完成所有工作,我们需要修改角色数组的大小。您可以设置数组的大小 char str[] 在里面 main 25 .

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

    char str[26] = "This is the original text"; ,您还可以避免忘记 \0 ,您可以这样做: char str[] = "This is the original text"; 因此,将任务留给编译器来确定数组的大小;)

        2
  •  0
  •   Some programmer dude    7 年前

    你好像忘了 char 字符串真的被调用了 以null结尾 字节字符串。这个 这一点非常重要,因为所有标准函数都希望知道字符串何时何地结束。

    你的阵列 str 太小了,适合终结者。改为使其成为26个元素的数组。或者不要显式指定大小,让编译器设置它。

        3
  •  0
  •   Felipe Soares    7 年前

    我测试了你的代码,除了 unsigned 问题,你错过了 return 中的声明 shiftchar 作用

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