Исключение IndexOutOfRange при использовании переменной int в качестве селектора массива

Я пытаюсь создать очень простую систему входа в систему на С#, используя массивы для сравнения имени пользователя и пароля.

Я использую цикл for() для сравнения имени пользователя и пароля, которые пользователь предоставляет, с именами пользователей и паролями, которые находятся в моих массивах. Вот мой код цикла:

string user = null, usrpassword = null;
string[] usernames = {"admin", "guest"};
string[] userpasswords = {"adminpw", "guestpw"};

Console.Write("Username: "); //Username
user = Console.ReadLine();
Console.Write("Password: "); //Password
usrpassword = Console.ReadLine();
Console.WriteLine("Processing...");

for (int i = 0; i <= usernames.Length; i++)
{
    if (user == usernames[i] && usrpassword == userpasswords[i])
    {
        loginloop = false;
        Console.WriteLine("Login Successful.");
    }
    else if (i > usernames.Length)
    {
        //incorrect username
        Console.WriteLine("Incorrect username or password!");
    }
} //for-loop-end

Я не получаю никаких синтаксических ошибок при сборке, но когда он достигает цикла for, он падает и дает мне исключение IndexOutOfRange.


person Sindri Kristján    schedule 10.10.2013    source источник
comment
Вы действительно хотите полагаться на индексы двух разных коллекций, чтобы найти пароль пользователя? Вместо этого вы могли бы хотя бы использовать Dictionary<string, string>. Имя пользователя — это ключ, а пароль — значение.   -  person Tim Schmelter    schedule 11.10.2013


Ответы (2)


Индексы массива начинаются с 0 и доходят до Length - 1, поэтому вы хотите продолжить цикл только тогда, когда итератор меньше Length.

Измените <= на <:

for (int i = 0; i < usernames.Length; i++)
{
    ...
}
person p.s.w.g    schedule 10.10.2013
comment
@SindriKristján, если один из этих постов отвечает на ваш вопрос, вы должны отметить его как таковой. Таким образом, другие пользователи с похожими вопросами с большей готовностью увидят эти ответы. - person davidsbro; 11.10.2013

У вас просто есть ошибка стиля "off by one" в ваших условиях цикла for;

for (int i = 0; i <= usernames.Length; i++)

вместо этого должно быть

for (int i = 0; i < usernames.Length; i++)

Массив имеет «нулевой индекс», где свойство Length представляет собой длину, отсчитываемую от единицы до n. Конечный индекс на самом деле является значением на единицу меньше Length или 0 в случае пустого массива.

person evanmcdonnal    schedule 10.10.2013