Почему происходит выход за границы массива?

Выходит крайне странная вещь, почему вылазит исключение если его не должно быть? j + 2 написал для наглядности, что оно срабатывает, но при этом на j + 1 оно выбрасывает исключение
5fa3c7837786a121359958.png

Вот локальные данные на момент выброса исключения, то есть массив с которым я работаю как видите имеет размерность куда больше, чем j + 1 при j = 0 на первой итерации
5fa3c831f33b0411899498.png

Cуть этого цикла заключается в том, чтобы поменять местами буквы в слове согласно цифрам записанным в key List

Весь код программы

class Generator
    {
        public static string Text { get; set; } = "Hello how are you";

        static List<int> GenerationKey()
        {
            var words = Text.Split(' ');
            var key = new List<int>();

            int counter = 0;

            // Запись ключа
            for (int i = 0; i < words.Length; i++)
            {
                for (int j = 0; j < words[i].Length; j++)
                {
                    key.Add(++counter);
                }

                counter = 0;
            }



            // Перемешивание ключа
            var rand = new Random();
            int step = 0;

            for (int i = 0; i < words.Length; i++)
            {
                for (int j = 0; j < words[i].Length; j++)
                {
                    int a = rand.Next(step, words[i].Length + step);
                    int b = rand.Next(step, words[i].Length + step);

                    int temp = key[a];
                    key[a] = key[b];
                    key[b] = temp;
                }
                step += words[i].Length;
            }

            return key;
        }


        public static void EncryptionText()
        {
            var key = GenerationKey();
            var words = Text.Split(' ');
            char[] letters;
            

            for (int i = 0; i < words.Length - 1; i++)
            {
                letters = words[i].ToCharArray();

                for (int j = 0; j < letters.Length; j++)
                {
                    var temp = letters[key[j]];
                    letters[key[j]] = letters[key[j + 1]];
                    letters[key[j + 1]] = temp;
                }
            }
        }


    }
  • Вопрос задан
  • 258 просмотров
Решения вопроса 2
Zoominger
@Zoominger
System Integrator
Потому что вы обращаетесь к элементу с индексом j = j + 2
Когда j равен количеству элементов минус один, тогда и происходит выход за пределы массива.

Ну или на последней строчке, где вы делаете то же самое, но + 1.
Ответ написан
Комментировать
@rPman
В массиве key лежат индексы выходящие за пределы массива letters, а точнее при j=0 в данной строке обращаетесь к keys[1] со значением 5, когда как в letters максимум 4.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы