Помогите с C#. Индекс находился вне границ массива

Индекс выходит за пределы массива, где ошибка?

string m = textBox1.Text;
string k = textBox2.Text;
char[] orig = { };
string s, b; //Результат
int j, f; // Переменная для циклов
char[] massage = m.ToCharArray(); // Превращаем сообщение в массив символов.
char[] key = k.ToCharArray(); // Превращаем ключ в массив символов.

char[] alfavit = { 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з',
'и', 'й', 'к', 'л', 'м', 'н',
'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ',
'ы', 'ь',
'э', 'ю', 'я' };

int i = 0;
int N = alfavit.Length; //Мощность алфавита

//Делаем повторяющийся пароль
b = k;
while (b.Length < m.Length)
{
    b += key[i];
    i++;
}
//Начинаем цикл
for (i = 0; i < massage.Length; i++)
{
    // Ищем индекс буквы
    for (j = 0; j < alfavit.Length; j++)
    {
        if (massage[i] == alfavit[j])
        {
            break;
        }
    }
    //ищем индекс ключа
    for (q = 0; q < key.Length; q++)
    {
        if (key[q] == alfavit[q])
        {
            break;
        }
    }
    //Находим символ исходного сообщения
    orig[i] = Convert.ToChar((massage[i] + N - key[q]) % N);


}
s = new string(orig); // Собираем символы обратно в строку.
textBox3.Text = s.ToString();

Вот формула: pi = (ci + N - ki) mod N

pi - Символ исходного сообщения

Ni - Мощность алфавита

ki - Символ ключа

сi - Символ закодированного сообщения


Ответы (1 шт):

Автор решения: Павел Ериков

Если в key не будет символа из alfavit, то цикл пройдет до конца и q будет равен key.Length и на следующей строчке будет выход за пределы массива.

Перед формулой добавьте проверку на этот случай:

if(q != key.Length) производим расчет
else выкидываем исключение

Можно выкинуть исключение о том, что символ не найден в алфавите, но тогда на пробеле между словами у вас будет выкидываться исключение, ну или вы можете например добавить его без изменений. Например "Привет, мир!" может выглядеть примерно так "Сткджф, окт!".

Так же массив char[] orig у вас пустой, а вы пытаетесь присвоить i-му элементу значение. Выделите память под message.Length элементов.

Ну тут основы языка:

char[] orig = new char[m.Length];
→ Ссылка