在cs50中使用Vigenere密码

时间:2014-05-20 23:21:21

标签: c vigenere cs50

我正在通过在线课程教我如何编码。我对此非常陌生,并且正在慢慢地通过这门课程。我遇到了vingenere密码的问题。它不会通过整个输入迭代密钥。

编辑:密钥应该遍历用户输入,当它到达密钥的末尾时,循环返回并重新开始。密钥也应该跳过任何特殊字符(!@#“”等)

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main (int argc, string argv[])
{
    if(argc !=2)
    {
        printf("please put in command line argument: example - ./vigenere command\n");
        return 1;
    }
    string key = argv[1];
    int keylength = strlen(key);
    for (int i=0;i<keylength; i++)
    {
        if(!isalpha(key[i]))
        {
            printf("please make sure command is letter only. Please no numbers or special characters!\n");
            return 1;
        }
    }
    string input = GetString();

    for (int i=0, k=0; i<keylength; i++)
    {
        if(isalpha(input[i]))
        {
            if(isupper(input[i]))
            {
                input[i]=((input[i]-'A')+(key[k%keylength]))%26+'A';
            }
            else
            {
                if(islower(input[i]))
                {
                input[i]=((input[i]-'a')+(key[k%keylength]))%26+'a';
            }
        }
    }
}
printf("%s\n",input);
return 0;
}

我知道字符串不正常,但它包含在标题中以帮助新学生。我想我们会随着课程的进展而学到更多。

1 个答案:

答案 0 :(得分:1)

您未在k循环中更改for。事实上,我认为你根本不需要k。而你的循环只迭代key的长度,而不是input的长度。

int inputlength = strlen(input);
for (int i = 0; i < inputlength; ++i) {
    if (isupper(input[i]))
        input[i] = ((input[i]-'A') + (key[i%keylength])) % 26 + 'A';
    /* ...                                ^ Use i here */
}

关于密钥为b且输入为A的问题,您必须调整密钥。

input[i] = ((input[i]-'A') + (key[i%keylength]-'a')) % 26 + 'A';

要跳过输入特殊字符,

int inputlength = strlen(input);
for (int i = 0, k = 0; i < inputlength; ++i) {
    if (isupper(input[i]))
        input[i] = ((input[i]-'A') + (key[(k++)%keylength])) % 26 + 'A';
    /* ...                                 ^^^ */
    else if (islower(input[i]))
        input[i] = ((input[i]-'a') + (key[(k++)%keylength])) % 26 + 'a';
}