设置另一个数组中的数组值时,如何修复IndexOutOfRange

时间:2019-07-07 10:03:16

标签: c# arrays

我是C#的新手,正在编写一个文本移动密码程序。但是,当尝试将一个数组值设置为另一个数组(加3)的值时,我总是会收到IndexOutOfRangeException。这听起来可能令人困惑,但老实说,我不知道如何真正说出这句话。

删除+3并没有帮助,而且似乎尝试从另一个数组设置数组总是导致错误。

for (int i = 0; i < CipherLength; i++)
{
    if (Alphabet.Contains(CipherArray[i]))
    {
        Console.WriteLine(i);
        Console.WriteLine(CipherArray[i]);
        CipherArray[i] = Alphabet[CipherArray[i + 3]];
    }
    else
    {
        CipherArray[i] = ' ';
    }
}

本质上,我试图将CipherArray值(在本例中为字符)设置为该字符移动3,这就是字母数组的作用。

预期:如果CipherArray[i] = A,则此后应等于D
实际:

  

System.IndexOutOfRangeException:'索引超出了   数组。”

(在所有情况下)

2 个答案:

答案 0 :(得分:2)

这是因为您正在尝试访问i + 3的{​​{1}}元素,当CipgerArray指向数组中的最后一个元素时,i超出范围。

您也在使这个复杂化。通常,字符用整数表示:

i + 3

因此范围是26个字符。如果要将每个字符移动3,则需要应用 var ch = 'a'; var i = (int)ch; // i = 97 ch = 'z'; i = (int)ch; // i = 122 运算符在C#中表示的mod函数(如果要从%移动,则需要z

将所有内容放在一起,您可以像下面这样编写算法:

c

请注意,我没有考虑大写字母。

答案 1 :(得分:0)

问题是,当您获得

Alphabet[CipherArray[i + 3]]

您正在将其传递给字母。我假设密码数组中包含字母,因此将其传递给Alphabet会导致错误。您需要说的是:

Alphabet[i + 3]

这就是我理解问题的方式。但这当然不会解决,您真正需要做的是获取字母数组中字母的索引,然后再添加3。所以:

Alphabet[Arrays.IndexOf(Alphabet, CipherArray[i]) + 3]

您将需要在字母Z,A,B和C之后再添加一次字母数组,以补偿加号3。如果我做错了事或不明白这个问题,请告诉我。希望对您有所帮助。