让Caesar Cipher环绕

时间:2017-01-16 03:42:43

标签: c cs50 caesar-cipher

我可以让它打印明文并按键值移动,但是 我有点困惑如何让字母包围,以及如何将它实现到我的代码中。

任何建议都将不胜感激。

谢谢。

#include <cs50.h>
#include <stdio.h>
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h>

//Gets number of user arguments and the key.
int main (int argc,  string argv[]) { 
    if(argc != 2) {
        printf("try again\n");
    }
    //Converts string to int. 
    int key = atoi(argv[1]);

    //Will store the chars + key. 
    int result;

    printf("Please enter what you would like to encrypt: "); 

    //Gets plaintext from user. 
    string plainText = get_string();       

    //Iterates over the user's input, checking for the case of each char. 
    for (int i = 0; i <= strlen(plainText); i++) {
        if (toupper(plainText[i]) || tolower(plainText[i])) { 
                    result = plainText[i]; 
        }
    //Checks if i'th char is a letter and shifts it. 
        if (isalpha(plainText[i])) { 
                    result = plainText[i + key]; 
        } 
    } 
    printf("%c", result);  
}

1 个答案:

答案 0 :(得分:1)

执行此操作的最大诀窍之一是使用模%运算符。

现在谈论你的代码,

for (int i = 0; i <= strlen(plainText); i++) {
if (toupper(plainText[i]) || tolower(plainText[i])) { 
            result = plainText[i]; 
}
//Checks if i'th char is a letter and shifts it. 
if (isalpha(plainText[i])) { 
            result = plainText[i + key]; 
  } 
} 
printf("%c", result);  

这段代码对我没用。 我的第一个if条件是我想要区分不是按字母顺序排列的字符,所以if条件可能类似于if (! isalpha(plainText[i])

然后你的第二个条件是如果字符是字母,则将字符添加到字符。它应该像

if (isalpha (plainText[i])) {
    if (islower(plainText[i]) 
        result = ((plainText[i] - 'a') + key) % 26 + 'a';
    else
        result = ((plainText[i] - 'A') + key) % 26 + 'A';

}

上述逻辑的说明::首先,您检查天气是否为小写或大写,以便您可以在026的范围内进行, 然后你用密钥的模数添加密钥,这样它就可以回到0,然后再通过添加'a'的值将它转换为ascii。

e.g。如果plainText[i] = 'x' (ascii value 120)key = 5,那么

plainText[i] =  120
plaintext[i] - 'a' = 23
(plaintext[i] - 'a') + key = 28 // Out of 0-25 alphabet range
((plaintext[i] - 'a') + key) % 26 = 2 // Looped back
(((plaintext[i] - 'a') + key) % 26) + 'a' = 99 (ascii value for 'c')

因为您可以看到我们在c添加5之后获得了x

最后,你的打印位置应该在循环内,否则它只打印最后一个输入,这是不正确的。

我希望我能帮助你,并牢记CS50的荣誉守则。而且我建议你在他们的论坛中提出这些问题,因为他们是一个更加知识渊博的社区,可以使用<cs50.h>

另外,享受CS50,它是最适合你入门的CS课程之一;)