Ошибка в коде Цезаря: строковый индекс выходит за границы
Я выполняю задание "Цезарь Шифр" для своего класса по информатике в 11 классе. Я много раз просматривал свой код, меняя его, но ничего, что я делаю, не работает, и я не понимаю, почему.
Ошибка, которую это дает мне, является java.lang.StringIndexOutOfBoundsException
import java.util.*;
//Caesar Cipher
public class CCTry1
{
public static void main (String [] args)
{
//scanner
Scanner scanner = new Scanner(System.in);
Scanner scanner2 = new Scanner(System.in);
//make an array with all the letters
char[] alphabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
//prompt user for a message
System.out.println("Enter your message.");
String message = scanner.nextLine();
//*******ENCRYPTING******
System.out.println("Enter your shift number.");
int shift = scanner2.nextInt();
//find index of each letter of the user's message, then add the shift number
//to obtain the new message
char newletter;
//for loop to encrypt
for(int i=0; i<26; i++)
{
//take the i letter
char letter = message.charAt(i);
//check if that letter = a
if (letter == alphabet[i])
{
//if letter = a, then the new letter is a+shift
newletter = alphabet[i+shift];
//if letter is capitalized, convert it to a capital then print
if(Character.isUpperCase(letter))
{
System.out.print(Character.toUpperCase(newletter));
}
//else, just print it as is
else
{
System.out.print(newletter);
}
}
}
}
}
1 ответ
Ваша проблема в вашей логике смены. Если вы попытаетесь сместить, например, z
к 5 индекс будет вне границ. Вам нужно "обернуться" в этот момент. Например, сдвиг z
на 2 должно фактически привести к b
(индекс 1), а не индекс 27.
Кроме того, ваш for
цикл не имеет смысла, потому что он будет работать только если message
ровно 26 символов
Вы должны перебирать буквы в сообщении, сдвигая каждую. Убедитесь, что вы "обернулись". Также нет необходимости в массиве букв.
Еще один совет: здесь может пригодиться модульная арифметика.