Как сравнить две строки для точности
Я делаю эту бесполезную программу только для того, чтобы вернуться к программированию должным образом, и я пытаюсь сравнить две строки для точности.
У меня в основном 2 строки: (пример)
(Константа, которую я сравниваю с) str1 = "abcdefghijkl"
(Вход) str2 = "abcdefghjkli"
Str2 верен с точностью до (включая) "h". Я хочу знать, какой% строки правильный.
Это код, который я до сих пор:
Private Function compareString(str1 As String, str2 As String)
'Compares str2 to str1 and returns a % match
Dim strNumber As Integer
Dim percentMatch As Integer
'Dim array1(16), array2(16) As Char
'array1 = str1.ToCharArray
'array2 = str2.ToCharArray
For x = 0 To str1.Length
'If array1(x) = array2(x) Then
If str1(x) = str2(x) Then
strNumber += 1
Else
Exit For
End If
Next
percentMatch = ((strNumber / (str1.Length - 1)) * 100)
percentMatch = CInt(CStr(percentMatch.Substring(0,4)))
Return percentMatch
Конечная функция Два прокомментированных раздела - это другой подход, который я попробовал до того, как пришел сюда. Код должен работать следующим образом
compareString ("abcdefghijkl", "abcdefghjkli")
strNum доберется до 8.
centMatch = ((8/12) * 100)
*centMatch = 75
Возврат 75
Но это не вернуть, На линии
If str1(x) = str2(x) Then
он возвращает ошибку: "Индекс был за пределами массива". Я понимаю ошибку, только не там, где я иду неправильно.
Если есть больше информации, которую я могу дать, я сделаю это, как только увижу уведомление:)
Заранее спасибо,
Rinslep
3 ответа
Я знаю, что это было открыто некоторое время, но я немного изучил это. Вы должны уважать длину строк тоже. Скажем, у вас есть две строки. ABCD
а также AEF
, AEF составляет 75% от длины ABCD. Каждое письмо в ABCD стоит 25%. И есть одна буква, которая является правильной в AEF, и это А. И как А = 25%: 75% * 25% = 0,75 * 0,25 = 0,1875 = 18,75%
, Строка AEF на 18,75% равна ABCD.
Надеюсь, вы поняли.:)
Вам нужно проверить длину заданных строк, также вы не должны выходить за границы, а также не выходить из цикла до проверки всей строки:
Dim x As Integer = 0
While x < str1.Length AndAlso x < str2.Length
If str1(x) = str2(x) Then
strNumber += 1
End If
i = i + 1
End While
Если вы считаете строку
str = "ABCDE";
str.Length равно 5. Но если вы индексируете его с помощью индекса на основе 0,
str[0] = 'A'
...
str[4] = 'E'
'str[5] throws exception (5 = str.Length)
Теперь в вашем
For x = 0 To str1.Length
Если вы сравните с моим примером, когда x равен длине строки, вы проверяете str[5], который выходит за пределы, и, следовательно, выдает исключение.
Измените эту строку на
Dim shorterLength = IIf(str1.Length < str2.Length, str1.Length, str2.Length); 'So that you cannot go beyond the boundary
For x = 0 To (shorterLength - 1)
Ура!!!