2015-02-16 3 views
-2

Я делаю эту бесполезную программу, чтобы правильно вернуться к программированию, и я изо всех сил пытаюсь сравнить две строки для точности.Как сравнить две строки для точности


Я в основном есть 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 

End Function Два комментировал секции другой подход, который я пытался до приезда сюда. Код должен запустить следующего

CompareString ("ABCDEFGHIJKL", "abcdefghjkli")

strNum получит до 8.

percentMatch = ((8/12) * 100)

* percentMatch = 75

Возвращение 75

Но, его не возвращает это, на линиях

If str1(x) = str2(x) Then 

он возвращает ошибку, «Индекс находился вне границ массива.» Я понимаю ошибку, просто не там, где я ошибаюсь.

Если Theres больше информации я могу дать, я сделаю это, как только я вижу уведомление :)

Спасибо заранее,

Rinslep

+0

Вы не можете использовать 'str1 (x) = str2 (x)', если str1 и str2 имеют разную длину. – Jaxedin

+2

Вы также повторяете один индекс за конец 'str1'. Позже вы вызываете 'Substring' значение с плавающей запятой. – pmcoltrane

+0

Он разбивается на первую итерацию, так что даже если бы они были разных длин, наверняка это не имело бы значения? – Rinslep

ответ

0

Если рассматривать строку

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 

Если сравнить с моим, например, когда х равно длине строки, вы проверяете ул [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) 

Ура !!!

+0

Ах, забыл изменить это назад. Я пробовал, и это не сработало. Он разбивается на первую итерацию в цикле for. Может ли быть, что строки, с которыми я фактически работаю, имеют разную длину? – Rinslep

+0

Хорошо, если это так, вы правы. Поскольку две строки имеют две разные длины, индекс более короткой строки выходит за границы. Я уточню свой ответ. Спасибо, что дали мне знать. –

+1

Позвольте мне угадать, вы преобразовали это из C#. В VB оператор оценки либо «If (Expression, TruePart, FalsePart)», либо «IIf» (Expression, TruePart, FalsePart) ». –

0

вам необходимо проверить длину данных строк также не должна превышать границу, а также не делать, не выход из цикла до проверки всей строки:

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 
+1

Почему бы просто не сделать 'For x = 0 To Math.Min (str1.Length, str2.Length) - 1'? –

+0

вы видите что-то в вопросе, в котором упоминается, что вы не используете решение, которое вы предоставили! ??, ваше решение тоже неплохая идея, но вы могли бы предложить его в комментарии, а не спрашивать «почему бы не ....!?», Потому что никто не сказал «НЕ используйте его». – jfun

+0

Успокойся ... Я не сказал, что кто-то сказал «не используйте». Я только что проинформировал вас об этой маленькой строке кода. Я ничего не знаю о ваших способностях кодирования или о том, насколько вы знаете о циклах и математических функциях, поэтому я не знаю, что вы знаете. Я просто предложил свой код и использовал фразу «Почему не просто ...», чтобы сообщить вам, что вы тоже можете это сделать, а также означать, что это может быть проще/короче. Я действительно не говорил, что ваш код был неправильным, потому что оба наших кода делают то же самое. –

0

Я знаю, что это было открыто некоторое время, но Я изучал это немного. Вы должны были бы также учитывать длину строк. Скажем, у вас две строки. ABCD и AEF. AEF составляет 75% длины ABCD. Каждая буква в ABCD стоит 25%. И есть одно письмо, которое правильно в AEF, и это A. И как A = 25%: 75% * 25% = 0,75 * 0,25 = 0,1875 = 18,75%. Строка AEF на 18,75% равна ABCD.

Надеюсь, вы поняли. :)

Смежные вопросы