在特定索引之前或之后的多个步骤中搜索元素时,索引超出数组范围
Index outside bounds of the array when searching for an element multiple steps before or after a specific index
问题:我正在控制台应用程序中重新创建 Battleship,用户输入的格式为 'letter-number-letter-number' (A1E1)。该程序需要确定第二个字母的索引在加上或减去 4 时是否与第一个字母相同,以验证用户输入的长度是否符合船舶类型。但是,当我的代码运行时,索引超出了数组的范围。
例如,巡洋舰有 5 个空格长。因此,要水平放置 Cruiser,数字必须相同,并且字母必须在 validInputs 数组中彼此相距 4 个元素。
一些输入的工作,例如:A3E3 工作,但是,E3A3 将越界。
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
处)足够远,因此减法和加法不会导致数字超出范围。
为了避免异常,您需要在尝试访问索引之前验证它们是否在数组边界内。
例如:
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])
而不是:
if (placementInput[1] - placementInput[3] == 0)
问题:我正在控制台应用程序中重新创建 Battleship,用户输入的格式为 'letter-number-letter-number' (A1E1)。该程序需要确定第二个字母的索引在加上或减去 4 时是否与第一个字母相同,以验证用户输入的长度是否符合船舶类型。但是,当我的代码运行时,索引超出了数组的范围。
例如,巡洋舰有 5 个空格长。因此,要水平放置 Cruiser,数字必须相同,并且字母必须在 validInputs 数组中彼此相距 4 个元素。
一些输入的工作,例如:A3E3 工作,但是,E3A3 将越界。
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
处)足够远,因此减法和加法不会导致数字超出范围。
为了避免异常,您需要在尝试访问索引之前验证它们是否在数组边界内。
例如:
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])
而不是:
if (placementInput[1] - placementInput[3] == 0)