凯撒密码移动角色

时间:2016-04-19 02:19:06

标签: c arrays string encryption

上个月我收到了这个作业,但由于我在此之后会说出问题,最终弄错了。目前,我正在做Caesar的密码,我相信我的格式正确。我问用户一个字符串,并用key == 3加密。但是,如果明文字母是XYZxyz,我想循环使用字母表。但是,当我把这些中的任何一个放入时,我不会得到ABC,而是]...和其他大括号。任何解决问题的提示。 谢谢!

void main()
{    
    int key = 3;

    char string[256];
    int i = 0;

    printf("Enter the string you want encrypted\n");
    fgets(string, sizeof(string), stdin);

    for (i = 0; i < strlen(string); i++) {
        if (string[i] == ' ') {;}

        else if  ((string[i] >= 'a' && string[i] <= 'z' || string[i] >= 'A' && string[i] <= 'Z')){
                string[i] = string[i] + key;
        }
    }
    printf("Cipher text:%s",string);
}

3 个答案:

答案 0 :(得分:4)

您需要查看ASCII表:http://www.asciitable.com/。您正在使用字符的ASCII编码。

Z的小数值为90,因此93为&#39;]&#39;。您需要手动回绕到字母表的开头。最好使用模数并添加第一个字母字符的ASCII值。由你如何包装大写字母(回到&#39; a&#39;或者&#39; A&#39;)。

答案 1 :(得分:1)

您需要将字符转换为字母表中的位置,然后找到模26(字母长度)的结果,然后将其转换回字符。类似的东西:

char base = 0;
if(string[i] >= 'a' && string[i] <= 'z'){
    base = 'a';
}else if(string[i] >= 'A' && string[i] <= 'Z'){
    base = 'A';
}
if(base){
    string[i] = ((string[i] - base) + key) % 26 + base;  
}

答案 2 :(得分:1)

你几乎得到了它:

#include <stdio.h>
#include <string.h>

int main() {
    char string[256];
    int i = 0;
    int key = 3;
    const int num_letters = 26;

    printf("Enter the string you want encrypted\n");
    fgets(string, sizeof(string), stdin);

    for (i = 0; i < strlen(string); i++) {
        if (string[i] >= 'a' && string[i] <= 'z') {
            string[i] = 'a' + (string[i] - 'a' + key) % num_letters;
        }
        else if (string[i] >= 'A' && string[i] <= 'Z') {
            string[i] = 'A' + (string[i] - 'A' + key) % num_letters;
        }
    }
    printf("Encrypted: %s\n", string);
    return 0;
}

Enter the string you want encrypted
Zorro
Encrypted: Cruur

在C中,您可以使用模运算符%进行环绕,如上所示。祝你好运!