Шифр подстановки не декодируется, код убит

Я должен расшифровать сообщение (в данный момент просто делаю отдельные слова) и превратить его обратно в правильное слово. У меня есть ключ шифрования (строка из 26 букв, где первая буква — это то, во что превращается A, вторая — то, во что превращается B и т. д.), который мне нужно использовать, чтобы вернуться к исходному слову. Мой код почему-то не имеет ошибок, но не декодируется и через некоторое время просто убивается серверами. Не знаю, почему он не будет правильно выполнять функцию дешифрования. Может ли кто-нибудь увидеть проблему с моим кодом, которую я не вижу?

Я пробовал код на Eclipse Che, а также на кодовой доске (я новый студент универа, еще не профессионал), и он нигде не работает. У меня есть работающий фрагмент кода, который шифрует сообщение практически таким же образом, но код расшифровки (по сути, то же самое, только наоборот) просто не будет работать.

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

char subdecrypt(char *phrase, char *encryptionKey);
char alphabetdecrypt(char *phrase, char x, char *encryptionKey);

int main()
{
    char phrase[206]="NCPPQ NQYRBMY"; 
    char alphabet[200]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char encryptionKey[200]="QAZXSWEDCVFRTGBNHYUJMKILOP"; 

    printf("The decryption is:\n");
    subdecrypt(phrase, encryptionKey);

    return 0;
}

char subdecrypt(char *phrase, char *encryptionKey)
{
    char i=0, x=0;
    char alphabet[200]="ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
    while(phrase[i] != 0)
    {
        while(phrase[i] != encryptionKey[x])
        {
            x++;
        }
        alphabetdecrypt(phrase, x, encryptionKey);
        i++;
    }
}

char alphabetdecrypt(char *phrase, char x, char *encryptionKey)
{
    char alphabet[200]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    encryptionKey[x]=alphabet[x];
    printf("%c", alphabet[x]);
}

Фраза, жестко закодированная с этим, должна быть расшифрована в PIZZA. Но в настоящее время на выходе ничего нет, и код в конечном итоге уничтожается.


person bellaacaitt    schedule 18.04.2019    source источник
comment
Почему вы перезаписываете свой ключ шифрования? Если вы сделаете это, каждая буква, которая встречается более одного раза, не будет правильно расшифрована.   -  person derpirscher    schedule 18.04.2019
comment
Возможно, вы хотели сделать while(phrase[i] != '\0' вместо while(phrase[i] != 0   -  person Sandy    schedule 18.04.2019
comment
Кроме того, почему вы перезаписываете ключ шифрования encryptionKey[x]=alphabet[x];?   -  person Sandy    schedule 18.04.2019
comment
проблема была в том, что я перезаписывал ключ шифрования! спасибо, я не видел, что он делает это. упс   -  person bellaacaitt    schedule 19.04.2019
comment
@bellaacaitt Верните свой вопрос в исходную форму (с кодом) и примите ответ, см.: stackoverflow.com/help/accepted-answer< /а>   -  person Mathieu    schedule 19.04.2019
comment
@bellaacaitt, потому что вы отредактировали свой исходный вопрос, другие пользователи не увидят, что на самом деле было задано. это не точка Stackoverflow   -  person user3469811    schedule 19.04.2019


Ответы (2)


Внутри внешнего цикла while в subdecrypt вам необходимо сбросить x = 0, прежде чем вы начнете проверять наличие символа фразы в ключе шифрования. Без него вы быстро получите доступ к концу alphabet.

person 1201ProgramAlarm    schedule 18.04.2019

Зашифрованная строка имеет ' ', но ее нет в ключе шифрования, поэтому ваш код застревает в цикле while(phrase[i] != encryptionKey[x]) в поисках соответствующего ключа.

Кроме этого есть еще две проблемы. Во-первых, это условие во внешнем цикле while while(phrase[i] != '\0'), а во-вторых, сбрасывается x.

Исправленная версия:

#include <stdio.h>


char subdecrypt(char *phrase, char *encryptionKey);
char alphabetdecrypt(char *phrase, char x, char *encryptionKey);

int main()
{
    char phrase[206]="NCPPQ NQYRBMY"; 
    phrase[13] = '\0';
    char encryptionKey[200]="QAZXSWEDCVFRTGBNHYUJMKILOP "; 

    printf("The decryption is:\n");
    subdecrypt(phrase, encryptionKey);

    return 0;
}

char subdecrypt(char *phrase, char *encryptionKey)
{
    char i=0, x=0;
    while(phrase[i] != '\0')
    {
        x = 0;
        while(phrase[i] != encryptionKey[x])
        {
            x++;
        }
        alphabetdecrypt(phrase, x, encryptionKey);
        i++;
    }
}

char alphabetdecrypt(char *phrase, char x, char *encryptionKey)
{
    char alphabet[200]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    printf("%c", alphabet[x]);
}
person Sandy    schedule 18.04.2019
comment
Сброс х помог, спасибо. Сама петля была в порядке. - person bellaacaitt; 19.04.2019