奇怪的输出与caesar.c

时间:2014-11-05 02:25:37

标签: c caesar-cipher cs50

来自我的caesar.c文件的代码

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


int main(int argc, string argv[])
{
    // get a string from the user, a non-negative integer.
    if (argc != 2 || atoi(argv[0]) < 0)
    {
        printf("Usage: ./caesar cyphertext\n");
        return 1;
    }

    // create the cyphertext.
    int cyphertext = atoi(argv[1]);

    // declare plaintext input.
    string plaintext = GetString();

    // get the plaintext encrypted using the key.
    for (int i = 0, n = strlen(plaintext); i < n; i++)
    {
        if (plaintext[i] > 'A' && plaintext[i] <= 'Z')
        {
            plaintext[i] = (plaintext[i] - 'A' + cyphertext) % 26;
        }   
            else if (plaintext[i] >= 'a' && plaintext[i] < 'z')
            {
                plaintext[i] = (plaintext[i] - 'a' + cyphertext) % 26;
            } 
    }
    {
        // print out the results of the cypher and plaintext.
        printf("%s\n", plaintext);
    }
    return 0;   
}

输出 我键入./caesar 13,然后在下一行输入“hello”一词。 你好然后返回几个小字母和数字的小盒子。我不能 复制并粘贴确切的字符。

编辑:

感谢您的帮助。我按照你的帮助清理了,现在当我运行check50程序时

check50 2014/x/pset2/caesar caesar.c

我收到以下错误:

:( encrypts "BARFOO" as "EDUIRR" using 3 as key
   \ expected output, but not "EAUIRR\n"

然而,当我用3键作为键运行BARFOO这个词时,我确实得到输出为 EAUIRR。

1 个答案:

答案 0 :(得分:1)

你在凯撒加密中犯了错误。

plaintext[i] = (plaintext[i] - 'A' + cyphertext) % 26;

应该是

plaintext[i] = 'A' + ((plaintext[i] - 'A' + cyphertext) % 26);

plaintext[i] = (plaintext[i] - 'a' + cyphertext) % 26;

应该是

plaintext[i] = 'a' + ((plaintext[i] - 'a' + cyphertext) % 26);

说明:

考虑案例明文[i] =&#34; h&#34;。

plaintext[i] - 'a' 

生成7.(&#39; h&#39; - &#39; a&#39;)

(plaintext[i] - 'a' + cyphertext) % 26

取20((7 + 13)%26)

该代码为20的字符是控制代码&#34; DC4&#34;它不可打印。

这就是为什么你会在&#34;中看到&#34;带有小写字母和数字的小方框。

您可以通过添加代码&#39; a&#39;来解决此问题。到20岁。