【问题标题】:Index outside bounds of the array when searching for an element multiple steps before or after a specific index [closed]在特定索引之前或之后多步搜索元素时,索引超出数组范围[关闭]
【发布时间】:2021-04-27 17:36:50
【问题描述】:

问题:我正在控制台应用程序中重新创建 Battleship,并且用户输入的格式为“字母数字字母数字”(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;
    }

【问题讨论】:

标签: c# arrays error-handling console-application


【解决方案1】:

该异常意味着您正在尝试访问数组边界之外的索引。

"E3A3" 不起作用的原因是您使用第二个字母进行比较 (validInputCheck = placementInput[2]),而在 "E3A3" 中,该字母是 A

字母AvalidInputs 数组中的索引为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)

【讨论】:

  • 非常感谢!我不知道在这种情况下您必须验证索引是否在范围内。这帮了大忙。
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多