如何在使用Substring和length方法时避免System.ArgumentOutOfRangeException



我正在创建一个猜谜游戏,但每次我第二次输入正确的字符字母时,它都会抛出异常,但一开始看起来很好,但当我再次猜测正确的字母时,我得到了异常。异常为System.ArgumentOutOfRangeException:'startIndex不能大于字符串的长度。(参数"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!

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的字符串,因为这是不可能的,很可能会导致异常。

回顾这行代码应该做什么。

Substring中的第二个参数是子字符串的长度,这就是的原因

temp.Substring(i + 1, temp.Length)

是错误的:temp.Length整个字符串的长度,这就是对于子字符串来说太大的原因。你可以把它作为

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

这里CCD_ 8的意思是";从i + 1开始并且直到结束";。

编辑:如果任意i,您也应该检查i

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

相关内容