next up previous contents index
Next: Matrici Up: Funzioni di libreria sulle Previous: Funzioni di confronto   Indice   Indice analitico

Funzioni di ricerca

Le funzioni di ricerca all'interno di stringhe sono le seguenti:
char* strchr (const char* s, char c)
char* strrchr (const char* s, char c)
char* strstr (const char* s, const char* needle)
char* strtok (char* s, const char* delimitatori)
esse sono particolarmente utili all'interno di tutti i programmi contenenti un parser, cioè un analizzatore di espressioni. Le funzioni strchr e strrchr cercano la prima occorrenza del carattere c all'interno della stringa s e tornano un puntatore ad essa; la differenza tra di esse è che strchr comincia la ricerca a partire dal primo carattere di s, strrchr dall'ultimo. Entrambe tornano un puntatore nullo se il carattere non viene trovato.

// ex6_6_5
#include <iostream.h>
#include <string.h>
void main() {
  char* s = "stringa: `Manuale di programmazione in C++'";
  cout << s << "\n";
  cout << "ricerca di `e':\n";
  cout << "da sx: " << strchr (s, 'e') << "\n";
  cout << "da dx: " << strrchr(s, 'e') << "\n";
  cout << "ricerca di `q': " << strchr(s, 'q') << "\n";
}

esempio di output:
stringa: `Manuale di programmazione in C++'
ricerca di `e':
da sx: e di programmazione in C++'
da dx: e in C++'
ricerca di `q': (null)

La funzione strstr ha un funzionamento del tutto simile alle due funzioni appena illustrate, con la differenza che la chiave di ricerca è costituita non da un carattere, bensì dalla stringa needle:


// ex6_6_6
#include <iostream.h>
#include <string.h>
void main() {
  char s[50], needle[50];
  cout << "stringa? "; cin >> s;
  cout << "needle ? "; cin >> needle;
  cout << "prima occorrenza: " << strstr (s, needle);
}

esempio di output:
stringa? Ostrogradsky
needle ? rog
prima occorrenza: rogradsky

Ovviamente needle potrebbe essere costituito anche da un solo carattere, per cui strchr è un caso particolare di strstr.

Infine, la funzione strtok (STRing TOKenize) serve a ridurre una stringa in token, cioè minime unità espressive; tale funzione è molto comoda per separare, ad esempio, le parole dalla punteggiatura all'interno di una frase; i segni da intepretare come punteggiatura sono quelli contenuti nella stringa delimitatori. Per effetturare delle ricerche multiple, basta richiamare la funzione strtok, dando alla stringa s un puntatore nullo. Vediamo un semplice esempio:


// ex6_6_7
#include <iostream.h>
#include <string.h>
void main() {
  char s[200] = "La matematica e' come l'amore: \ne' fatta di"
    " semplici idee, \nche possono diventare - estremamente"
    " - complicate. \n(R. Drabek)\n\n";
  cout << s;
  char delimitatori[10] = "\n:,-. ()";
  char* parola = new char[20];
  parola = strtok (s, delimitatori);
  while ( parola != 0 ) {
    cout << parola << "\n";
    parola = strtok(0, delimitatori);
  }
}

output:
La matematica e' come l'amore:
e' fatta di semplici idee,
che possono diventare - estremamente - complicate.
(R. Drabek)

La
matematica
e'
come
l'amore
e'
fatta
di
semplici
idee
che
possono
diventare
estremamente
complicate
R
Drabek

Purtroppo per questo esempio non siamo riusciti ad evitare di utilizzare l'operatore new, di cui parleremo nel prossimo capitolo; basti sapere che con lo statement char* parola = new char[20], riusciamo ad ottenere dello spazio in memoria per la stringa parola.

ex-2
si provi a ``reinventare'' la ruota, scrivendo funzioni del tutto analoghe a quelle della libreria string.h presentate in questa sezione;


next up previous contents index
Next: Matrici Up: Funzioni di libreria sulle Previous: Funzioni di confronto   Indice   Indice analitico
Claudio Cicconetti
2000-09-06