我的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