Шифр Виженера в цикле C

У меня возникли проблемы с написанием последней части моего кода для задания, которое включает в себя написание шифра Виженера. Часть шифрования работает нормально, но мне трудно понять, как повторить слово/ключевое слово шифрования. Таким образом, он отлично работает, если сообщение, которое необходимо зашифровать, меньше или равно ключевому слову, а в противном случае оно выводит еще пару символов, которые кажутся зашифрованными, но на самом деле это не так.

Это код до сих пор:

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

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("YELL!\n");
        return 1;
    }
    //check if the number of command line arguments is correct, if not, YELL!

    string keyword = (argv[1]);
    //get keyword

    for (int j = 0, n = strlen(keyword); j < n; j++)
    {
    if(!isalpha(keyword[j]))
        {   
        printf("YELL!\n");
        return 1;
        }
    }
    //check if the keyword is only alphabetical, if not, YELL!

    string message = GetString();
    //get plaintext

    for (int j = 0, n = strlen(keyword); j < n; j++)
    {
        if (isupper(keyword[j]))
        {
            keyword[j] = (keyword[j] - 'A');
        }

        if (islower(keyword[j]))
        {
            keyword[j] = (keyword[j] - 'a');
        }
    }
    //this is to get the numerical values from the ascii values of the keyword.

    for (int i = 0, j = 0, n = strlen(message); i < n; i++, j++)
    //counting through the message & the cypher
    {
        if (isalpha(message[i]))
        {
            if (isupper(message[i]))
            {
            message[i] = (((message[i] - 'A') + keyword[j]) % 26 + 'A');
            }

            if (islower(message[i]))
            {
            message[i] = (((message[i] - 'a') + keyword[j]) % 26 + 'a');
            }

            //adding a keyword value [j] to message [i] and converting back to ascii value, 
            //individually for upper and lowercase characters.
        }
    printf("%c", message[i]);
    } 
}

Это, вероятно, простое решение, но я просто не могу понять его. Любая помощь будет принята с благодарностью!


person DoronV    schedule 19.02.2016    source источник


Ответы (1)


Это чудо, что шифрование работает на вас. Я думаю, что это не так, поскольку ваш цикл явно может выйти за пределы длины ключевого слова j, а затем keyword[j] выйдет за пределы и будет демонстрировать неопределенное поведение. Вам нужно только перебрать i по длине сообщения и проиндексировать ключевое слово с помощью keyword[i % strlen(keyword)], чтобы индекс циклически менялся от 0 до длины keyword минус один.

person Eugene Sh.    schedule 19.02.2016