我是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:'索引不在 数组。'
(在所有情况下(
这是因为您正在尝试访问CipgerArray
的i + 3
元素时,当i
指向数组中的最后一个元素时, i + 3
符合范围。
您也正在复杂化。通常字符由INT表示:
var ch = 'a';
var i = (int)ch;
// i = 97
ch = 'z';
i = (int)ch;
// i = 122
因此范围是26个字符。如果您想将每个字符移动3,则需要应用mod
函数,CC#在%
运算符中表示(如果您想从z
移动,则需要获得c
(。
将所有内容放在一起,您可以像这样编写算法:
var offset = 3;
var toCipher = "abxz";
toCipher = new string(toCipher
.Select(ch => ((ch - 97) + offset) % 26 + 97)
.Select(ch => (char)ch).ToArray());
请注意,我没有考虑大写字母。
问题是当您获得
时Alphabet[CipherArray[i + 3]]
您将其传递给字母。我认为密码阵列中有字母,因此将其传递到字母内将导致错误。您需要做的是:
Alphabet[i + 3]
这就是我理解问题的方式。但是,当然,这不会修复它,您真正需要做的就是在字母数组中获取字母的索引,然后在其中添加3个。所以:
Alphabet[Arrays.IndexOf(Alphabet, CipherArray[i]) + 3]
您需要在字母z,a,b和c再次添加字母数组,以弥补加号3。如果我做错了什么或不了解问题告诉我。希望它有帮助。