Я пытаюсь выполнить зашифрованное - расшифрованное задание на 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;
}
}