从另一个数组设置数组值时,如何修复indexoutofrange



我是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:'索引不在 数组。'

(在所有情况下(

这是因为您正在尝试访问CipgerArrayi + 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。如果我做错了什么或不了解问题告诉我。希望它有帮助。

最新更新