#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
так, вы тоже получите исключение