凯撒密码在C

时间:2017-11-18 22:25:23

标签: c encryption caesar-cipher

我正在尝试创建一个Caesar密码,所以我声明了一个将每个字符推送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 个答案:

答案 0 :(得分:1)

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

因此,您的函数声明应如下所示: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从而将作业留给编译器确定数组的大小;)

答案 1 :(得分:0)

您似乎忘记了char字符串实际上称为 空终止 字节字符串 null-terminator 非常重要,因为这是所有标准函数都在寻找知道字符串何时何地结束的内容。

您的数组str很小,以适应终结符。使它成为一个由26个元素组成的数组。或者不要显式指定大小,让编译器设置它。

答案 2 :(得分:0)

我测试了您的代码,除了$(document).ready(function () { var siteWidth = $('.container').width(); $('.navbar').width(siteWidth); }); 问题之外,您还缺少unsigned函数中的return语句。

shiftchar