0

我的 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”。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。

4

1 回答 1

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]="h" 的情况。

plaintext[i] - 'a' 

使 7. ('h' - 'a')

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

赚 20. ((7 + 13) % 26)

代码为20的字符为控制码“DC4”,不可打印。

这就是为什么你会看到“里面有小写字母和数字的小盒子”。

您可以通过将代码 ot 'a' 添加到 20 来解决此问题。

于 2014-11-05T02:41:54.430 回答