0

家庭作业:我在以下代码中获取和索引越界。这是一个刽子手游戏,我正在跟踪我在char数组中猜到的字母。

这是我所做的假设:

  1. 在调用方法中,我有一个未填充的数组 ( ) 作为参数char[] displayGuesses = new char[26];传递给下面的方法。char[] usedLetters
  2. 字母猜测的第一次迭代,数组将为空。
  3. 它的长度将为0。
  4. usedLetters[0]我用letterGuessed参数填充。
  5. 下一次我猜,数组的长度将是 1,所以usedLetters[1]会被填充......等等。

    public char[] trackUsedLetters(char letterGuessed, char[] usedLetters)
    {
        int letterIndex = usedLetters.Length;
        usedLetters[letterIndex] = letterGuessed;  
        return usedLetters;
    }
    

我认为可能发生了几件事。

  1. 当我尝试usedLetters在第一次运行时获取长度时,空数组不返回零,而是返回 null。繁荣。越界。
  2. 传递一个由 26 个成员定义的空白数组存在一些问题......?但我不确定这个问题会是什么,所以我不知道谷歌搜索什么会产生相关结果。
  3. 我可能有范围问题;尽管使用循环,但我发现此链接指向Java 的类似问题。for不太明白 Java 用户想要什么,但其中一些问题听起来很熟悉。

我需要第二双眼睛来看待这个问题,并为我指出解决这个问题的正确方向。

4

3 回答 3

4

根据c#规范:(强调我的)

1.8 数组

数组类型是引用类型,数组变量的声明只是为数组实例的引用留出空间。实际的数组实例是在运行时使用 new 运算符动态创建的。新操作指定新数组实例的长度,然后在实例的生命周期内固定。数组元素的索引范围从 0 到 Length - 1。new运算符会自动将数组元素初始化为其默认值,例如,对于所有数值类型,默认值为零,对于所有引用类型,默认值为 null。

将 char 数据类型默认为 '\0' 的默认值

于 2013-04-13T03:21:26.227 回答
1

看起来你想要List<char>那种可以增长(with Add)的方法。

数组具有固定大小,并且以下代码(您在示例中拥有)将始终抛出超出范围异常,因为您正在访问数组中最后一个元素之后的元素。

usedLetters[usedLetters.Length] = 'c';

有关数组长度的更多详细信息:

// newArray - array of 0 chars. newArray.Length is 0
var newArray = new char[0]; 

// nullArray not created, nullArray.Length will throw NullReferenceExcetption
char[] nullArray = null; 

// defaultArray = array of 26 characters, each value 0.
// defaultArray.Length is 26;
char[] defaultArray = new char[26];
于 2013-04-13T02:49:12.913 回答
0

当您定义一个新数组,但不手动初始化其中的项目时,它将自动使用数组包含的任何类型的默认值进行初始化。在您的情况下,您正在创建一个字符数组。char 的默认值为 '\0' 或空字符。

这意味着数组永远不会真正“空”。如果你定义一个有 26 个槽的数组,它总是有这个长度,除非你创建一个新数组。

于 2014-01-26T00:13:54.577 回答