Как избежать системы.Исключение ArgumentOutOfRangeException при использовании метода подстроки и длины

#c# #substring

Вопрос:

Я создаю игру в угадайку, но она выдает исключение каждый раз, когда я во второй раз ставлю правильную букву символа, но сначала это кажется нормальным, но когда я снова угадываю правильную букву, я получаю исключение, исключение было системным.Исключение ArgumentOutOfRangeException: ‘Начальный индекс не может быть больше длины строки. (Параметр ‘startIndex’) я перепробовал все возможные способы исправить это, но я все еще не могу найти правильное решение, надеюсь, вы сможете мне помочь.

 using System;
using System.Collections;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            String secret = " ", temp = " ", lalagyan = " ", answer="";
            int count = 0, num = 5;
            bool bol = false;
            var random = new Random();
            ArrayList list = new ArrayList { "one", "two", "three", "four" };
            int index = random.Next(list.Count);
            String word = list[index].ToString();

            for (int i = 0; i < word.Length; i  )
            {
                secret = word.Replace(word, "-");
                Console.Write(secret);
            }
            do
            {
                count  ;
                Console.WriteLine("nEnter a letter ");
                Console.WriteLine("Remaining Chances: "   num);
                Console.WriteLine("Clue: the word is "   word.Length   " letters");
                Console.Write("Answer: ");
                answer = Console.ReadLine();
                num--;
                Console.WriteLine("");
                for (int i = 0; i < word.Length; i  )
                {
                    //dito
                    if (answer.Equals(Convert.ToString(word[i])))
                    {
                        if (!bol)
                        {
                            temp  = Convert.ToString(word[i]);
                        }
                        else
                        {
                            //error around here
                            Console.Write("Correct Lettern");
                            lalagyan = Convert.ToString(word[i]).Replace("-", answer);
                            temp = temp.Substring(0, i)   lalagyan   temp.Substring(i   1, temp.Length - i   1);
                        }
                    }
                    else
                    {
                        if (!bol)
                        {
                            temp  = "-";
                        }
                    }
                }
                bol = true;
                Console.Write(temp);
            }
            while (count < 5);
            Console.Write("nEnter Your Final Guess: ");
            answer = Console.ReadLine();
            answer = answer.ToUpper();
            if (answer.Equals(index))
            {
                Console.WriteLine("nYour Guess Is Correct!");
            }
            else
            {
                Console.WriteLine("nYour Guess Is Wrong!");
            }
        }
    }
}
 

Выход:

 ---
Enter a letter
Remaining Chances: 5
Clue: the word is 3 letters
Answer: o

 --o
Enter a letter
Remaining Chances: 4
Clue: the word is 3 letters
Answer: t

Correct Letter
t --o
Enter a letter
Remaining Chances: 3
Clue: the word is 3 letters
Answer: w

Correct Letter
tw--o
Enter a letter
Remaining Chances: 2
Clue: the word is 3 letters
Answer: o

Correct Letter
two-o
Enter a letter
Remaining Chances: 1
Clue: the word is 3 letters
Answer: o

Correct Letter
two-o
Enter Your Final Guess: two

Your Guess Is Wrong!
 

Комментарии:

1. Ты звонишь temp.Substring() дважды. Какой из них создает исключение? Разбейте их на отдельные операции и отладьте, чтобы выяснить. Когда возникает исключение, какое точное значение temp ? Какова точная стоимость i ?

2. temp.Substring(i 1, temp.Length) это почти наверняка неправильно. Обратите внимание, что второй параметр-это количество символов, которые вы хотите извлечь, так что, возможно, вы имеете в виду temp.Substring(i 1, temp.Length - i - ))

Ответ №1:

ArgumentOutOfRange исключение обычно означает, что вы пытаетесь получить значение, которое находится за пределами массива/коллекции.

В вашем случае, если пользователи угадают последнюю букву, i значение в этом:

 temp = temp.Substring(0, i)   lalagyan   temp.Substring(i   1, temp.Length);
 

первый temp.Substring(0,i) вернет всю временную строку, а второй temp.Substring(i 1, temp.Length) попытается вернуть строку длины temp.Length , начинающуюся с последнего индекса — поскольку это невозможно, это, скорее всего, вызовет исключение.

Просмотрите, что должна делать эта строка кода.

Ответ №2:

Второй аргумент в Substring — это длина подстроки, вот почему

   temp.Substring(i   1, temp.Length)
 

является ошибочным: temp.Length это длина всей строки, и поэтому она слишком велика для подстроки. Вы можете сформулировать это так

   temp = temp.Substring(0, i)   lalagyan   temp.Substring(i   1);
 

Здесь temp.Substring(i 1) означает «начальная форма i 1 и до конца«.

Редактировать: В случае произвольного i вы i также должны проверить:

   temp = 
      i <= 0 ? lalagyan   temp 
    : i >= temp.Length ? temp   lalagyan
    : temp.Substring(0, i)   lalagyan   temp.Substring(i   1);
 

Комментарии:

1. Обратите внимание, что если i 1 это уже >= temp.Length так, вы тоже получите исключение