-1

我正在通过 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");
}
4

3 回答 3

1

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

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

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

于 2014-08-13T23:22:49.660 回答
0

好吧,我无法提供完整的答案,因为我也在为此苦苦挣扎。但是,我从您的代码中注意到的几件事是,您的plainTextisargv[2]但应该只通过命令行传递 2 个参数(argv[0](程序的名称)和argv[1](用户键))。对于plainText您应该GetString()从 cs50 库中使用。

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

于 2014-08-13T22:57:12.227 回答
0

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

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

我没有查看作业的要求,所以我不确定该程序是否可以处理关键字符为大写或小写(甚至非字母)的可能性,如果是这样,您将需要添加一些处理这种复杂性的逻辑。此外,程序现在的编码方式,如果你的密钥比明文短,你就会遇到问题——我假设你的代码应该在必要时处理“包装”密钥。

于 2014-08-13T23:23:19.587 回答