CS50 Vigenere密码输出错误

时间:2014-08-04 18:10:21

标签: 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");
}

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

请记住,mod运算符(%)的优先级高于加法和减法;您可能需要使用parens将其应用于正确的子表达式。

我还没有看过作业的要求,所以我不确定该程序是否应该处理关键字符大写或小写(甚至非字母)的可能性,如果所以你需要添加一些逻辑来处理这种复杂性。此外,程序现在的编码方式,如果你的密钥比明文短,你会遇到问题 - 我认为你的代码应该处理&#39;包装&#39;必要的关键。