Ошибка в коде Цезаря: строковый индекс выходит за границы

Я выполняю задание "Цезарь Шифр" для своего класса по информатике в 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 символов

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

Еще один совет: здесь может пригодиться модульная арифметика.

Другие вопросы по тегам