簡體   English   中英

cs50 中的 Vigenere 密碼

[英]Vigenere cipher in 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;
}

我知道字符串不正常,但它包含在標題中以幫助新學生。 我想隨着課程的進行,我們會學到更多。

您沒有在for循環中更改k 事實上,我認為你根本不需要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 ,input為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';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM