以下代码应该在消息框中显示字符串 checkme 中第三 a 的索引,但是当我运行时程序它没有给我正确的答案(应该是12,而不是我得到9)。我做错了什么以及如何让它成功?
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim checkme As String = "thais is a sample sentence a"
Dim indexnum As Integer
indexnum = checkme.IndexOf("a", checkme.IndexOf("a") + 3)
MessageBox.Show(CStr(indexnum))
End Sub
选项Explicit和Strict必须为On。提前谢谢。
答案 0 :(得分:2)
我做错了什么?
你找到了第二个a
。我猜你在想这个:
checkme.IndexOf("a", checkme.IndexOf("a", 3))
这实际上会给你正确的结果。 (它说“找到第一个发生在第三个字符之后或之后发生的第一个字符(恰好是a)”)
您的原始代码说“在第一个a之后的3个位置或之后发现第一个a”,这只会让您到达第二个a
。
如何解决?
你可以在循环中使用IndexOf
,将最后找到的索引重用为下一个起始索引。
Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
ByVal checkChar as Char, _
ByVal n as Integer) as Integer
Dim lastIndex As Integer = -1
For i As Integer = 1 To n
lastIndex = checkme.IndexOf(checkChar, lastIndex + 1)
If lastIndex = -1 Then Return -1
Next i
Return lastIndex
End Function
你必须小心;如果您在每次尝试时都没有检查-1
并立即退出,则最终可能会得到错误的结果。
如果您忘记了这一点(正如其他一些帖子似乎有),那么如果您在单个a
的字符串中搜索第三个a
,您实际上会返回索引第一个a
(当您尝试查找第二个a时,您会将索引重置为-1
,这基本上会开始搜索)
出于这个原因,仅仅准确地写出你的意思可能更清楚:
Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
ByVal checkChar as Char, _
ByVal n as Integer) as Integer
Dim count as Integer = 0
For i as Integer = 0 To checkme.Length - 1
If(checkme(i) = checkChar) Then
count += 1
If(count = n) Then Return i
End If
Next i
return -1
End Function
答案 1 :(得分:1)
checkme.IndexOf("a")
是2.添加3给出5.所以整个表达式变为:
indexnum = checkme.IndexOf("a", 5)
找到第二个。
如果你想找到第N个,循环N次,每次循环循环:
pos = checkme.IndexOf('a', pos + 1)
在循环之前,将pos设置为-1。
答案 2 :(得分:1)
你只找到第二个“a”。尝试使用这样的循环。
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim checkme As String = "thais is a sample sentence a"
Dim indexnum As Integer = -1
For i As Integer = 1 To 3
indexnum = checkme.IndexOf("a", indexnum + 1)
Next
MessageBox.Show(CStr(indexnum))
End Sub
答案 3 :(得分:0)
您拥有的代码不会产生预期的效果。相反做的是找到位于第2位的第一个“a”。然后它找到在位置5(2 + 3)之后出现的第一个“a”。如果你想要第三个“a”,你可以使用类似于以下内容的东西
indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)
答案 4 :(得分:0)
为什么会是12?位置5之后的下一个“a”位于第9位。您的代码基本上分解为:
'thais is a sample...
'0123456789
Dim idxFirstA = checkme.IndexOf("a") ' equals 2
'thais is a sample...
'0123456789
Dim idxThirdA = checkme.IndexOf("a", 2 + 3) ' equals 9
你跳过第一个“a”(位置2),然后找到第二个“a”(位置9)。
答案 5 :(得分:0)
Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button4.Click
Dim checkme As String = "thais is a sample sentence a"
Dim indexnum As Integer = -1, occrnc As Integer = 0
For x As Integer = 0 To checkme.Length - 1
indexnum = checkme.IndexOf("a", indexnum + 1)
If indexnum <> -1 Then occrnc += 1
If occrnc = 3 Then Exit For
Next
If occrnc = 3 Then MessageBox.Show(indexnum.ToString)
End Sub