-1

我正在通过在线课程教我如何编码。我对此很陌生,并且一直在慢慢地完成这门课。我遇到了 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;
}

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

4

1 回答 1

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 */
}

关于key为b,输入为A,必须调整key的问题。

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';
}
于 2014-05-20T23:29:29.127 回答