Hypersill Java расшифрованная задача - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь выполнить зашифрованное - расшифрованное задание на HyperSkill.

Задача: написать программу, которая читает три строки из стандартного ввода: целевая операция (en c - шифрование, de c - дешифрование), сообщение или зашифрованный текст и ключ для шифрования / расшифровать сообщения. Все не буквенные символы должны быть зашифрованы так же, как и обычные буквы.

У меня проблема с расшифрованной частью.

Я получаю сообщение об ошибке:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
    at java.base/java.lang.String.charAt(String.java:709)
    at encryptdecrypt.Main.dec(Main.java:63)
    at encryptdecrypt.Main.main(Main.java:18)

Что я делаю не так?

Мой код:

package encryptdecrypt;

import java.util.Scanner;

public class Main {


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("What to do?");
        String target = scanner.nextLine();
        String input = scanner.nextLine();
        int key = scanner.nextInt();

        if (target.equals("enc")) {
            enc(input, key);
        } else if (target.equals("dec")) {
            dec(input, key);
        }

    }

    public static String enc(String input, int key) {

        String output = "";
        String alphabet = "abcdefghijklmnopqrstuvwxyz";


        for (int i = 0; i < input.length(); i++) {
            String inputCharacter = Character.toString(input.charAt(i));

            if (!alphabet.contains(inputCharacter)) {
                output += inputCharacter;
            }

            for (int j = 0; j < alphabet.length(); j++) {
                String alphabetCharacter = Character.toString(alphabet.charAt(j));
                String decryptedCharacter = Character.toString(alphabet.charAt((j + key) % alphabet.length()));

                if (inputCharacter.equals(alphabetCharacter)) {
                    output += decryptedCharacter;
                }
            }
        }
        System.out.println(output);
        return output;
    }

    public static String dec(String input, int key) {

        String encrypted = "";
        String alphabet = "abcdefghijklmnopqrstuvwxyz";


        for (int i = 0; i < input.length(); i++) {
            String decryptedCharacter = Character.toString(input.charAt(i));

            if (!alphabet.contains(decryptedCharacter)) {
                input += decryptedCharacter;
            }

            for (int j = 0; j < alphabet.length(); j++) {
                char alphabetCharacter = alphabet.charAt(j);
                String encryptedCharacter = Character.toString(alphabet.charAt((j - key) % alphabet.length()));

                if (encryptedCharacter.equals(alphabetCharacter)) {
                    encrypted += encryptedCharacter;
                }
            }
        }
        System.out.println(encrypted);
        return encrypted;
    }
}


Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Вам нужно поменять алфавит и использовать (j + клавиша)

0 голосов
/ 25 апреля 2020

Это может помочь вам предотвратить отрицательный индекс в charAt (клавиша j):

if (key > j) {
    j += alphabet.length();
}
0 голосов
/ 10 марта 2020

Я настоятельно рекомендую вам начать с написания тестов для вашего кода.

Если вы прочитаете сообщение об ошибке, оно фактически сообщит вам о том, что является вашей проблемой «Строковый индекс вне диапазона: -1»

Это, скорее всего, связано со строкой, содержащей

(j - key) % alphabet.length() 

, поскольку любое значение, отличное от 0 для ключа, приведет к отрицательному числу, которое соответствует javado c для charAt

IndexOutOfBoundsException - if the index argument is negative or not less than the length of this string.
...