C语言 CS50 Vigenere密码输出错误



我正在通过EDX学习哈佛CS50课程(仅为我自己,这不是评分工作)。我的PSET2的Vigenere密码给出了错误的输出-例如,密钥和a的输入都应该导致a的输出,但却给出了t。但是,我不能确定问题在哪里。

#import <stdio.h>
#import <cs50.h>
#import <string.h>
#import <ctype.h>
int main(int argc, char *argv[])
{
    //Variables
    string key;
    key = argv[1];
    string plainText;
    plainText = argv[2];
    int i;
    int k;
    i = 0;
    k = 0;

    //Encrypt the string
    for (i = 0; i < strlen(plainText); i++)
    {
        if (isalpha(plainText[i]))
        {
            if (islower(plainText[i]))
            {
                printf("%c",plainText[i] - 97 + key[k]  % 26 + 97);
                k++;                   
            }   
            if (isupper(plainText[i]))
            {
                printf("%c",plainText[i] - 65 + key[k] % 26 + 65);
                k++;
            }
        }
        else 
            printf("%c",plainText[i]);
    }
    printf("n");
}

如果假定key数组的值表示循环移位值(aA表示零移位,bB表示1移位,以此类推),则编码表达式应如下所示

(plainText[i] - 97 + key[k] - 97) % 26 + 97

当然,在这种情况下,您还必须独立考虑key[k]字符的情况(并从key[k]中减去9765),此时您完全忽略了它。

嗯,我不能提供一个完整的答案,因为我也在努力解决这个问题。然而,我从你的代码中注意到的一些事情是,你的plainTextargv[2],但应该只有2个参数通过命令行(argv[0](程序名称)和argv[1](用户密钥))。对于plainText,您应该使用cs50库中的GetString()

我注意到的另一件事是,虽然你在printf()中使用key[k],但你没有在循环中迭代它。这部分我也有困难。所以,不幸的是,我不能确定这部分。为了使a/a = 0和z/z = 25,我想你可能需要一个循环来遍历键的每个字母。

不要忘记您的key[]字母值从97(小写)或65(大写)开始-您需要调整它们以使mod 26操作有意义。

请记住,mod操作符(%)的优先级高于加法和减法;您可能需要使用parent来使它应用于正确的子表达式。

我没有看过赋值的要求,所以我不确定程序是否期望处理关键字符是大写或小写(甚至是非alpha)的可能性,如果是这样,您将需要添加一些逻辑来处理这种复杂性。此外,程序现在的编码方式,如果您的密钥比明文短,您将遇到问题-我假设您的代码预计会在必要时处理"包装"密钥。

最新更新