C# 在特定索引之前或之后的多个步骤中搜索元素时,索引位于数组边界之外
问题:我正在一个控制台应用程序中重建战舰,用户输入的格式是“字母编号字母编号”(A1E1)。程序需要找出第二个字母加上或减去4后的索引是否与第一个字母相同,以验证用户输入的船型长度是否可接受。但是,当我的代码运行时,索引超出了数组的边界 例如,一艘巡洋舰有5格长。因此,要水平放置巡洋舰,数字必须相同,字母之间的距离必须为validInputs数组中的4个元素 一些输入的工作,例如:A3E3工作,但E3A3将超出范围C# 在特定索引之前或之后的多个步骤中搜索元素时,索引位于数组边界之外,c#,arrays,error-handling,console-application,C#,Arrays,Error Handling,Console Application,问题:我正在一个控制台应用程序中重建战舰,用户输入的格式是“字母编号字母编号”(A1E1)。程序需要找出第二个字母加上或减去4后的索引是否与第一个字母相同,以验证用户输入的船型长度是否可接受。但是,当我的代码运行时,索引超出了数组的边界 例如,一艘巡洋舰有5格长。因此,要水平放置巡洋舰,数字必须相同,字母之间的距离必须为validInputs数组中的4个元素 一些输入的工作,例如:A3E3工作,但E3A3将超出范围 public static char[] validInputs = new c
public static char[] validInputs = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', '1', '2', '3', '4', '5', '6', '7', '8', '9', 't' };
if (placementInput[1] - placementInput[3] == 0)
{
char validInputCheck = placementInput[2];
// Finds index of the 2nd letter in valid inputs
int validInputIndex = Array.IndexOf(validInputs, validInputCheck);
// Validates that the 2nd letter is either 4 steps behind or
// ahead of the first letter within the validInputs array.
if (placementInput[0] == validInputs[validInputIndex - 4] ||
placementInput[0] == validInputs[validInputIndex + 4])
{
validationCounter++;
break;
}
异常意味着您正试图访问超出数组边界的索引
“E3A3”
不起作用的原因是您使用第二个字母进行比较(validInputCheck=placementInput[2]
),而在“E3A3”
中,该字母是A
字母A
在validInputs
数组中的索引为0
,在您的代码中,您尝试获取validInputs[validInputIndex-4]
,其计算结果为validInputs[-4]
,这显然超出了数组边界
“A3E3”
起作用的原因是字母E
距离数组末端足够远(在索引4
),因此减法和加法不会导致超出边界的数字
public static char[] validInputs = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', '1', '2', '3', '4', '5', '6', '7', '8', '9', 't' };
if (placementInput[1] - placementInput[3] == 0)
{
char validInputCheck = placementInput[2];
// Finds index of the 2nd letter in valid inputs
int validInputIndex = Array.IndexOf(validInputs, validInputCheck);
// Validates that the 2nd letter is either 4 steps behind or
// ahead of the first letter within the validInputs array.
if (placementInput[0] == validInputs[validInputIndex - 4] ||
placementInput[0] == validInputs[validInputIndex + 4])
{
validationCounter++;
break;
}
为了避免异常,在尝试访问索引之前,需要验证索引是否在数组边界内
例如:
if ((validInputIndex - 4 > -1 &&
placementInput[0] == validInputs[validInputIndex - 4]) ||
(validInputIndex + 4 < validInputs.Length &&
placementInput[0] == validInputs[validInputIndex + 4]))
{
validationCounter++;
break;
}
而不是:
if (placementInput[1] - placementInput[3] == 0)
您必须验证
validInputIndex+4
和validInputIndex-4
是否在数组中的索引范围内。这是否回答了您的问题?非常感谢!我不知道在这种情况下必须验证索引是否在范围内。这是很大的帮助。