我是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:'索引超出了 数组。”
(在所有情况下)
答案 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。如果我做错了事或不明白这个问题,请告诉我。希望对您有所帮助。