Помогите с 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];