【问题标题】:CS50x 2019 pset2: Vigenère does not fully workCS50x 2019 pset2:Vigenère 无法完全正常工作
【发布时间】:2019-08-07 16:27:25
【问题描述】:

我目前正在研究 CS50x 2019 的 pset2,特别是 Vigenère。 CS50 成绩册显示我上传到 GitHub 后完成了 93%。

我已经尝试了其他一些可以在网上找到的代码 sn-ps,但它们似乎不起作用。

这是我的程序中创建密文的部分:

    string k = argv[1];
    // Get the plaintext and print out the ciphertext
    string s = get_string("plaintext: ");
    printf("ciphertext: ");

    // Iterate through plaintext letter by letter
    for (int i = 0, n = strlen(s) ; i < n; i++)
    {
        int key = tolower(k[i % strlen(k)]) - 'a';

        // Check if the letter is lowercase, uppercase or neither and print out the rotated character
        if (islower(s[i]))
        {
            printf("%c", (((s[i] - 'a') + key) % 26) + 'a');
        }
        else if (isupper(s[i]))
        {
            printf("%c", (((s[i] - 'A') + key) % 26) + 'A');
        }
        else
        {
            printf("%c", s[i]);
        }
    }

    printf("\n");
    return 0;

文档中有一些示例,您可以使用代码进行测试。

以下示例不适用于我的代码:

$ ./vigenere bacon
plaintext:  Meet me at the park at eleven am
ciphertext: Negh zf av huf pcfx bt gzrwep oz

我的输出是:

$ ./vigenere bacon
plaintext: Meet me at the park at eleven am
ciphertext: Negh ne og tjs qaty bt syfvgb bm

如您所见,前 4 个字符是正确的,但其余字符不正确。

【问题讨论】:

  • 这个键是假的:int key = tolower(k[i % strlen(k)]) - 'a';因为,当明文字符等于 m 时, k[5%5]= k[0] = b 。所以 m+b = m+1 = n 。

标签: cs50 vigenere


【解决方案1】:

这个int key = tolower(k[i % strlen(k)]) - 'a'; 有问题。

来自规范:

还请记住,每次对字符进行加密时,都需要 移动到 k 的下一个字母,关键字(并环绕到 如果您用尽了关键字的所有字符,则在关键字的开头)。但如果 您不加密字符(例如,空格或标点符号), 不要前进到 k 的下一个字符!

底线是:由于plaintextkey 以不同的“速率”运行,因此您不能对两者使用相同的索引(在本例中为i)。程序应该一次抓取plaintext 一个字符,就像这里所做的那样。但它需要一种单独的方法来控制key 中的字符,因此您可以 1)跳过空格/标点符号和 2)环绕。 key 索引的另一个变量将是解决它的一种方法。代码中可能还有其他问题,但这是一个根本缺陷。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2015-01-31
    • 2014-01-30
    相关资源
    最近更新 更多