Неалфавитная задача в множестве задач Вигенере - PullRequest
0 голосов
/ 08 февраля 2019

Я только что сделал с проблемой Vigenere в CS50, но, тем не менее, есть только один неправильный, не алфавитные символы, когда вы пишете в незашифрованном виде что-либо без пробелов, запятая, любой не алфавитный, программа будет работать хорошо, ноесли вы написали любой не алфавитный символ, например пробел, следующий символ возьмет неправильный ключ, это мой код:

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



int main(int argc, string argv[])
{    



    // Make sure there is a command-line argment
    if (argc != 2)
    {
        printf("Error\n");
        return 1;
    }

    // Variables
    int key[strlen(argv[1])];
    string plaintext;


    // Make sure the comman-line argment is Alphabets then make the key


    for (int i = 0, n = strlen(argv[1]); i < n; i++)
    {

        if (!isalpha(argv[1][i]))
        {
            printf("Error 2\n");
            return 1;
        }

        if (islower(argv[1][i]))
        {
            key[i] = argv[1][i] - 'a';
        }

        else if (isupper(argv[1][i]))
        {
            key[i] = argv[1][i] - 'A';
        }  
    }





    // Ask the user to write the message
    plaintext = get_string("plaintext: ");
    printf("ciphertext: ");



    // Make sure the plaintext doesn't equal NULL
    if (plaintext != NULL)
    {


        for (int i = 0, n = strlen(plaintext); i < n ; i++)
        {

            // Print in slower case
            if (islower(plaintext[i]))
            {
                printf("%c", (((plaintext[i] + key[i % strlen(argv[1])])  - 'a') % 26) + 'a');
            }

            // Print in upper case      
            else if (isupper(plaintext[i]))
            {
                printf("%c", (((plaintext[i] + key[i % strlen(argv[1])])  - 'A') % 26) + 'A');
            }

            // Print the non alphabetic 
            else if (!isalpha(plaintext[i]))
            {
                printf("%c", plaintext[i]);
            }


        }           
        // Print a new line 
        printf("\n"); 
    }
}

1 Ответ

0 голосов
/ 08 февраля 2019

Проблема в том, что вы используете один и тот же индекс для открытого текста и ключ в этом цикле
for (int i = 0, n = strlen(plaintext); i < n ; i++).Ключ продвигается на одну позицию каждый раз, когда происходит открытый текст.Очевидно, это не то, что вы хотите.Вам необходимо управлять индексом ключа независимо от индекса открытого текста в этом цикле.

Предложите вам пересмотреть пошаговое руководство и, возможно, напишите пример, аналогичный тому, как Замила делает пример с пандой.И никогда не рано научиться пользоваться debug50 .Если я правильно помню, на 2-й неделе для него есть короткая позиция.

В CS50x есть форум по стеку , посвященный вопросам и ответам о CS50x и наборе игровых пакетов.

...