Differenze tra le versioni di "Conoscere il numero e la posizione di tutte le occorrenze di una sottostringa in una stringa"

Da Gambas-it.org - Wikipedia.
Riga 24: Riga 24:
 
  '''End'''
 
  '''End'''
  
 
 
'''Public''' Sub Main()
 
 
  Dim s As String
 
  Dim ss As String[]
 
  Dim n, c As Short
 
 
 
    s = "mela pera arancia banana pera arancia banana mela pera mela"
 
   
 
    s = Replace(s, "\n", Chr(32))
 
   
 
    ss = Split(s, " ")
 
   
 
    Print "L'occorrenza è stata trovata alle posizioni:"
 
    For n = 0 To ss.Max
 
      If ss[n] = "pera" Then
 
        Inc c
 
        Print n + 1
 
      Endif
 
    Next
 
   
 
    Print "\nper un totale di "; c; " volte."
 
   
 
'''End'''
 
  
  

Versione delle 09:08, 11 mag 2020

Mostriamo alcune modalità per conoscere la posizione di ogni eventuale occorrenza di una parola all'interno di una stringa.


Con le sole risorse di Gambas

Public Sub Main()
 
 Dim s As String
 Dim i, ris As Integer
 
' Poniamo il caso che la stringa sia la seguente...
  s = "mela pera arancia banana pera arancia banana mela pera mela"
 
  Repeat
' ...e che la parola, di cui cercare le occorrenze, sia "pera":
    i = InStr(s, "pera", i)
    If i Then
      Inc i
      Inc ris
    Endif
  Until i == 0
  
  Print ris
 
End


Utilizzando un'apposita libreria dinamica condivisa .so esterna

Quest'altra modalità prevede la creazione e l'uso di un'apposita libreria dinamica condivisa .so esterna, scritta in C, che in sostanza provvederà a cercare il solo numero delle occorrenze della substringa all'interno della stringa:

Library "/tmp/lib_Occorrenze"

' int Occorrenze(const char *stringa, const char *substr)
' Ritorna il numero di occorrenze di una sottostringa all'interno di una stringa.
Private Extern Occorrenze(stringa As String, substr As String) As Integer


Public Sub Main()

Dim s, su As String 
Dim i As Integer

' Va a generare l'apposita libreria dinamica condivisa esterna:
 CreaSo()

' La stringa è la seguente:
 s = "mela pera arancia limone pera banana noce mela fico pera noce"
 
' La sottostringa di cui conoscere il numero di occorrenze:
 su = "pera"
 
 i = Occorrenze(s, su)
 
 Print "Numero occorrenze della sottostringa '"; su; "': "; i
 
End


Private Procedure CreaSo()
 
' Imposta il sorgente della libreria dinamica condivisa esterna:
 File.Save("/tmp/lib_Occorrenze.c", "#include <string.h>" &
           "\n\n" &
           "int Occorrenze(const char *stringa, const char *substr) {" &
           "\n\n" &
           "   int i = 0;" &
           "\n\n" &
           "   do {\n" &
           "      stringa = strstr (stringa, substr);\n" &
           "      if (stringa) {;\n" &
           "         ++stringa;\n" &
           "         ++i;\n" &
           "      }else{\n         break;\n      }" &
           "\n   }\n" &
           "   while (stringa);" &
           "\n\n" &
           "   return i;\n\n}")
           
 
' Genera la libreria dinamica condivisa esterna:
 Shell "gcc -o /tmp/lib_Occorrenze.so /tmp/lib_Occorrenze.c -shared -fPIC" Wait
 
End