Visual Basic移位密码



我的Ceasar移位密码程序有问题。当我必须用n移位密码加密一些文本时,代码工作得很好。但是,当我想解密某些文本时,数组索引为负,并且我得到一个错误:发生了类型为"System.IndexOutOfRangeException"的未处理异常。

Public Class Form1
Dim alfabet() As Char = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "æ", "ø", "å"}

Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
    Me.Close()
End Sub

Private Sub btnKod_Click(sender As Object, e As EventArgs) Handles btnKod.Click
    Kod(txtDekodet.Text, txtTrylletal.Text, True)
End Sub

Private Sub btnDekod_Click(sender As Object, e As EventArgs) Handles btnDekod.Click
    Kod(txtKodet.Text, -txtTrylletal.Text, False)
End Sub
Function Kod(tekst As String, trylletal As Integer, skalKodes As Boolean)
    Dim nyeCharVaerdier(tekst.Length) As Char
    For i As Integer = 0 To tekst.Length - 1
        Dim nytTal As Integer = findIndex(tekst(i), trylletal)
        If nytTal = -1 Then
            nyeCharVaerdier(i) = tekst(i)
        Else
            nyeCharVaerdier(i) = alfabet(nytTal)
        End If
    Next
    If skalKodes = True Then
        txtKodet.Text = nyeCharVaerdier
    Else
        txtDekodet.Text = nyeCharVaerdier
    End If
    Return Nothing
End Function

Function findIndex(tegn As Char, trylletal As Integer) As Integer
    For alfabetTaeller As Integer = 0 To alfabet.Length - 1
        If tegn = alfabet(alfabetTaeller) Then
            Dim nytIndex As Integer = (alfabetTaeller + trylletal) Mod alfabet.Length
            Return nytIndex
        End If
    Next
    Return -1
End Function

End Class

您的子例程可以工作。但是,用作查找表的数组被声明为char,但您试图用字符串填充它。如果启用了Option Strict,则会看到每个字符串下面都有一条歪歪扭扭的线,表示有错误。在每个字符的结束后放一个c,你的子程序就会工作。

Dim alfabet() As Char = {"a"c, "b"c, "c"c, "d"c, "e"c, "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c, "æ"c, "ø"c, "å"c}

顺便说一句。如果不返回任何有意义的数据,请将例程声明为Sub,而不是Function。如果要返回数据,请使用As子句来指示将返回的数据类型。

可能导致该错误的一件事是数组索引过大或小于零。请尝试在Visual Studio中运行该程序。当它得到错误时,显示它停止的代码行中所有变量的值。(使用调试菜单)。那你应该看到问题了。

我发现,如果我将alfabet()数组的长度添加到负的新索引中,一切都很好:-)

if nytTal < 0 Then
nytTal += nytTal + alfabet.Length
End If

最新更新