Vigenere не прошел тест :( шифрует «BaRFoo» как «CaQGon», используя «BaZ» в качестве ключевого слова - PullRequest
0 голосов
/ 06 декабря 2018

Может ли кто-нибудь помочь мне с моим кодом, чтобы решить эту ошибку выше? Я искал ответы, но они немного отличаются от моего кода.

  • vigenere.c компилируется.
  • шифрует «a» как «a» с использованием «a» в качестве ключевого слова
  • шифрует «barfoo» как «caqgon» с использованием «baz» в качестве ключевого слова
  • шифрует «BaRFoo» как «CaQGon» с использованием ««BaZ» как ключевое слово
    не удалось ожидается «ciphertext: CaQ ...», а не «ciphertext: CaQ ...»
  • шифрует «BARFOO» как «CAQGON» с использованием «BAZ»"как ключевое слово
  • шифрует" мир! $? "как "xoqmd! $?"использование «baz» в качестве ключевого слова
  • шифрует «привет, мир!»как "иэкмо, впрке!"использование "baz" в качестве ключевого слова
  • обрабатывает отсутствие argv [1]
    ошибка не удалось выполнить программу из-за ошибки сегментации
  • обрабатывает argc> 2
  • отклоняет "Hax0r2" в качестве ключевого слова

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


int main(int argc,string argv[])
{
    for (int k = 0;k<strlen(argv[1]);k++)
    {
        if (isalpha(argv[1][k]))
        {}
        else
        {
            return EXIT_FAILURE;
        }
    }
    if (argc == 2)
    {
        int alpha,cipher,key,j=0,len=strlen(argv[1]);
        char a;
        string plaintext = get_string("Text: ");
        printf("ciphertext: ");
        for (int i = 0; i<strlen(plaintext) ; i++)
        {
            if (isalpha(plaintext[i]))
            {
                if (isupper(plaintext[i]))
                {
                    alpha = plaintext[i]-65;
                    key = argv[1][j]-65;
                    cipher = (key+alpha)%26;
                    a = (char) cipher+65;
                    printf("%c",a);
                    j=(j+1)%len;

                }
                else if (islower(plaintext[i]))
                {
                    alpha = plaintext[i]-97;
                    key = argv[1][j]-97;
                    cipher = (key+alpha)%26;
                    a = (char) cipher+97;
                    printf("%c",a);
                    j=(j+1)%len;
                }

            }
            else
            {
                printf("%c",plaintext[i]);
            }
        }
        printf("\n");
    }
    else
    {
        printf("error\n");
        return EXIT_FAILURE;
    }
}

1 Ответ

0 голосов
/ 06 декабря 2018

Ваш код правильно обрабатывает заглавные и строчные буквы в текстовом формате, но не правильно обрабатывает разные буквы регистра в ключевом слове.Когда вы обрабатываете заглавную текстовую букву, вы вычитаете 65 из буквы ключевого слова, даже если это не прописная буква.

Вы должны просто преобразовать все буквы ключевого слова в общий регистр и вычесть соответствующийпервая буква, чтобы получить сумму, которую нужно увеличить.

Также нет необходимости проверять islower() - если она не прописная, то должна быть строчная.Так что просто используйте else.

            if (isupper(plaintext[i]))
            {
                alpha = plaintext[i]-'A';
                key = toupper(argv[1][j])-'A';
                cipher = (key+alpha)%26;
                a = (char) cipher+'A';
                printf("%c",a);
                j=(j+1)%len;

            }
            else
            {
                alpha = plaintext[i]-'a';
                key = toupper(argv[1][j])-'A';
                cipher = (key+alpha)%26;
                a = (char) cipher+'a';
                printf("%c",a);
                j=(j+1)%len;
            }

Чтобы исправить ошибку сегментации из-за отсутствия argv[1], переместите цикл, который проверяет, что ключевое слово является буквенным в блоке if (argc == 2).Затем вы также можете использовать переменную len вместо повторения strlen(argv[1]) в цикле.

...