Individuare in una stringa i caratteri ricorrenti e loro posizioni

Da Gambas-it.org - Wikipedia.

Per poter individuare in una stringa i caratteri ricorrenti e loro rispettive posizioni, possiamo adottare varie modalità.

Ne mostriamo alcune, nelle quali si intende individuare il carattere "a" in una stringa di testo, e, per ciascun carattere "a" individuato, la sua posizione.

1a modalità

Public Sub Main()
 
 Dim s As String = "abcdabcdabcd abcd abcd"
 Dim i As Integer
 
  For i = 1 To String.Len(s)
    If Mid(s, i, 1) = "a" Then Print i, "a"
  Next
  
End


2a modalità

Public Sub Main()
 
 Dim s As String = "abcdabcdabcd abcd abcd"
 Dim bb As Byte[]
 Dim i As Integer
 
  bb = Byte[].FromString(s)
   
  For i = 0 To bb.Max
    If bb[i] = 97 Then Print i + 1, "a"
' oppure: If bb[i] = 97 Then Print i + 1, bb.ToString(i, 1)
' oppure: If bb.ToString(i,1) = "a" Then Print i + 1, bb.ToString(i, 1)
  Next
  
End


3a modalità

Public Sub Main()
 
 Dim s As String = "abcdabcdabcd abcd abcd"
 Dim bb As Byte[]
 Dim i As Integer
 
  bb = Byte[].FromString(s)
   
  Do
    If Byte@(bb.Data + i) = 97 Then Print i + 1, "a"
' oppure: If bb[i] = 97 Then Print i + 1, bb.ToString(i, 1)
' oppure: If bb.ToString(i,1) = "a" Then Print i + 1, bb.ToString(i, 1)
    Inc i
  Loop Until Byte@(bb.Data + i) = 0
  
End


4a modalità

Una leggera variante della precedente modalità:

Public Sub Main()
 
 Dim s As String = "abcdabcdabcd abcd abcd"
 Dim p As Pointer
 Dim i As Integer
 
  p = Alloc(s)
   
  Do
    If Byte@(p + i) = 97 Then Print i + 1, "a"
    Inc i
  Loop Until Byte@(p + i) = 0
  
  Free(p)
  
End


5a modalità

Una variante della precedente modalità, usando una variabile di tipo Stringa e la funzione InStr( ):

Public Sub Main()
 
 Dim s As String = "abcdabcdabcd abcd abcd"
 Dim i, r As Integer
 
  i = 1
  
  Do
    i = InStr(s, "b", i)
    If i > 0 Then
      Print i,
      Inc i
      Inc r
    Endif
  Loop Until i = 0
 
  Print "\n\n"; r
  
End